剑指offer2_替换空格_题解
替换空格
题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
分析
方案一:逆向遍历
\[结果字符串长度 = 原字符串长度 + 2 * 原字符串中空格数
\]
\[即new\_length = length + 2 * cnt
\]
从右向左遍历原字符串,当遇到原字符串当前字符为空格时,在结果字符串对应位置j左侧连续3个位置分别填充“02%“,否则将原字符串当前字符复制到结果字符串位置j
代码
/**
复杂度分析
1.时间复杂度:O(n)
2.空间复杂度:O(1)
**/
void replaceSpace(char *str, int length)
{
int cnt = 0; //空格个数
// 统计空格个数
for (int i = 0; i < length; i++)
{
if (str[i] == ' ')
++cnt;
}
if (!cnt)
return; //没有空格,直接返回
// 计算结果字符串长度
int new_length = length + 2 * cnt;
int j = new_length - 1; //j:结果字符串最后一个字符所在下标
// 替换空格
for (int i = length - 1; i >= 0; i--)
{
if (str[i] == ' ')
{
str[j--] = '0';
str[j--] = '2';
str[j--] = '%';
}
else
str[j--] = str[i];
}
}
方案二:增加一个新的字符串
增加一个新字符串,遍历原来的字符串,遍历过程中,如果非空格则将原来的字符直接拼接到新字符串中,如果遇到空格则将%20拼接到新字符串中
代码
/**
复杂度分析
1.时间复杂度:O(n)
2.空间复杂度:O(n)
开辟了新的字符数组
**/
void replaceSpace(char *str, int length)
{
// 动态分配一个新的字符数组,最大长度为3倍原来的字符串长度
char *ans = (char *)malloc(sizeof(char) * 3 * length);
int j = 0;//新的字符数组下标
// 将替换结果存储到新的字符数组中
for (int i = 0; i < length; i++, j++)
{
if (str[i] == ' ')
{
ans[j] = '%', ans[j + 1] = '2', ans[j + 2] = '0';
j += 2;//替换完成,新的字符数组下标右移2位
}
else
ans[j] = str[i];
}
// 将结果字符数组拷贝到原字符数组
strcpy(str, ans);
// 释放结果字符数组所占的空间
free(ans);
}