题目:请实现一个函数,把字符串中的每个空格替换成”%20”。例如输入为“We are happy.”,则输出为“We%20are%20happy.”。
思路:
空格是1个字符,%20是3个字符,直接替换,字符串会变长。
《》如果要是在原来的字符串上做替换,那么就有可能会覆盖修改在该字符串后面的内存。
《》如果是创建新的字符串并在新的字符串上做替换,那么可以分配足够的内存。
!!!所以要问清楚!!!
1.从前往后替换:
时间复杂度为O(n^2)
每遇到一个空格,后面的字符都需要往后移动两个字节
2.从后往前替换:
先遍历一遍字符串,统计字符串总长度和空格的数量,这样可以算出替换后所需要的字符串总长度。
//length为牛客系统规定字符串输出的最大长度,固定为一个常数
class Solution {
public:
void replaceSpace(char *str,int length) {
if(str==NULL || length<=0)//先判断字符串是否为NULL指针或空字符串
return;
//oriLength统计原来字符串的长度,空格数量
int oriLength=0;
int numOfSpace=0;
int i=0;
while(str[i]!='\0'){
++oriLength;
if(str[i]==' ')
++numOfSpace;
++i;
}
//newLength替换后的字符串长度
int newLength=oriLength+2*numOfSpace;
if(newLength>length)
return;
int indexOfOri=oriLength;
int indexOfNew=newLength;
while(indexOfOri>=0 && indexOfNew>indexOfOri){
if(str[indexOfOri]==' '){
str[indexOfNew--]='0';
str[indexOfNew--]='2';
str[indexOfNew--]='%';
}
else
str[indexOfNew--]=str[indexOfOri];
--indexOfOri;
}
}
};