方法一:
从头到尾扫描字符串,如果发现空格,必须把后面的字符向后移动两个字符在替换,否则会发生覆盖。
时间复杂度为O(n²),效率较低不推荐使用。
方法二:
从后向前遍历,统计空格出现次数,并可以计算出替换后的字符串总长度(每替换一个空格,长度增加两个字节,
因此替换后的长度等于原长度加上二倍的空格出现次数)
准备两个指针,一个在字符串原来的末尾另一个在替换后的末尾,遇见空格反向赋值%,0,2,其他直接替换
代码:
class Solution {
public:
//length为字符数组的总容量
void replaceSpace(char *str, int length)
{
if (str == NULL || length <= 0)
return;
//num_space为空格数量
//str_length为字符串实际长度
int num_space = 0;
int str_length = 0;
int i = 0;
while (str[i] != '\0')
{
if (str[i] == ' ')
{
++num_space;
++str_length;
}
else
{
++str_length;
}
++i;
}
if (num_space <= 0)
return;
int new_num = str_length + 2 * num_space;
//new_num为替换后字符的长度
int new_length_index = str_length;
int new_num_index = new_num;
while(new_num_index >= new_length_index && new_length_index >= 0)
{
if (str[new_length_index] == ' ')
{
str[new_num_index--] = '0';
str[new_num_index--] = '2';
str[new_num_index--] = '%';
}
else
{
str[new_num_index--] = str[new_length_index];
}
--new_length_index;
}
}
};
测试:
int main()
{
char arr[16] = "we are happy";
char* str = &arr[0];
Solution s;
s.replaceSpace(str,15);
int i = 0;
for(i=0;i<15;i++)
{
cout << arr[i] ;
}
return 0;
}