题目: 请实现一个函数,把字符串的每一个空格替换成%20. 例如输入 we are happy, 输出we%20are%20happy
最简单但是效率很低的做法,是从头到尾扫描字符串,每碰到一个空格就将其替换长%20,同时将字符串向后移动两格,否则%20会将字符串内容覆盖。这种做法的时间复杂度是O(N 2 ^2 2)。
另外一个做法是先扫描一次字符串,确定有多少空格后就能知道字符串在替换后的容量了。再从尾到头扫描字符串,将字符复制的新开辟的区域内,碰到空格就将其替换成%20,就可以完成。
替换的过程如下图:来自剑指offer
声明指针P1指向替换前的字符串末尾,指针P2指向替换后的字符串末尾。不断将P1的字符拷贝到P2中,直到P1遇到空格后,P2依次填入%20。直到复制完成。
下边是实现的代码:
void ReplaceSpaces(char string[], int len){
//判断输入正确性,len为字符串最大长度
if(len <= 0 || string==nullptr) return;
int space = 0;
int i = 0;
while(string[i]!='\0'){
if(string[i]==' ') space++;
++i;
}
int OriginalLength = i;
int NewLength = OriginalLength + space*2;
if(NewLength>len) return;
int NewIndex = NewLength - 1;
int OldIndex = OriginalLength - 1;
while(OldIndex >= 0){
while(string[OldIndex]==' ') {
string[NewIndex--] = '0';
string[NewIndex--] = '2';
string[NewIndex--] = '%';
OldIndex--;
}
string[NewIndex--] = string[OldIndex--];
}
}
测试用例:
- 输入字符串包含空格,空格可能在最前面,最后面,也有可能有多个空格
- 输入字符串没有空格
- 输入字符串无效,为空指针
- 输入字符串为多个空格