题目:实现一个函数,把字符串中的每个空格替换成“%20”。如输入“We are happy.”,输出“We%20are%20happy.”。
思路1:遍历字符数组,每遇到一个空格,则将其替换。因将空格替换成‘%20’,则替换后,字符数组的长度增2,即需将当前空格后面的字符依次向后移动两个位置,避免发生覆盖。
思路1的实现
void replaceBlank(char str[], int capacity)
{
int i = 0;
int numberOfBlank = 0;
for (int i = 0; str[i] != '\0';i++)
{
if (str[i] == ' ')numberOfBlank++;
}
if (strlen(str)+1 + numberOfBlank * 2 > capacity) //保证数组总容量能满足替换后所需容量。
{
cout << "原字符数组预定容量不足...." << endl;
return;
}
while (str[i] != '\0')
{
if (str[i] == ' ')
{
int len = strlen(str);//strlen的参数只能是char*;返回值不包含'\0';
for (len;len >= i;len--)
str[len + 2] = str[len];
str[i++] = '%';
str[i++] = '2';
str[i++] = '0';
}
else i++;
}
}
思路2:先遍历一遍字符数组,统计出数组中的空格数量,计算出替换后数组的长度,然后设置两指针P1、P2,P1指向原字符数组的末尾,P2针指向替换后字符数组的末尾,从后往前开始遍历和替换:移动P1指针,把P1指向的字符依次复制到P2指向的位置,当碰到一个空格时,在P2的当前位置依次插入“%20”,然后P1向前移动一个位置,重复以上操作,直到P1与P2指向同一位置时,说明字符数组中的空格替换完毕。该算法中,时间复杂度为o(n),空间复杂度为o(1)。
思路2的实现
void replaceBlank(char str[], int capacity)
{
int i = 0;
int numberOfBlank = 0;
for (int i = 0; str[i] != '\0'; i++)
{
if (str[i] == ' ')numberOfBlank++;
}
if (strlen(str) + 1 + numberOfBlank * 2 > capacity)
{
cout << "原字符数组预定容量不足...." << endl;
return;
}
int len = strlen(str);
int newlen = len + numberOfBlank*2;
while (len >= 0 && newlen > len)
{
if (str[len] == ' ')
{
str[newlen--] = '0';
str[newlen--] = '2';
str[newlen--] = '%';
}
else
{
str[newlen--] = str[len];
}
len--;
}
}