题目描述
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
问题剖析
能想到的比较直接的办法就是从头到尾查找,当遇到空格时,后面的字符后移两位,填充%20。这样的话假设字符串长度为n,每个空格字符,需要移动后面的 O(n) 个字符,因此对 O(n) 个空格字符的字符串而言复杂度就是 O(n2) 。
有没有更快的方法呢。我们换一种思路,把从前向后替换成从后向前替换。
解法
void replaceSpace(char *str,int length) {
if(str == NULL && length <= 0){
return;
}
//遍历字符串,得到空格字符的个数
int i = 0;
int iSpaceNumber = 0;
while(str[i] != '\0'){
if(str[i] == ' '){
++iSpaceNumber;
}
++i;
}
//得到替换为%20后得到总长度
int iNewLength = i + iSpaceNumber*2;
//检测替换后的字符串长度是否超过字符串的最大长度。
if(iNewLength > length){
return;
}
//最后一位要记得补充\0
str[iNewLength ] = '\0';
//从后向前遍历,移动到新字符串的最后,如果遇到空格就一次替换为0 2 %
while(i >= 0){
if(str[i] == ' '){
str[iNewLength --] = '0';
str[iNewLength --] = '2';
str[iNewLength --] = '%';
}
else{
str[iNewLength --] = str[i];
}
--i;
}
}