面试题5:替换空格
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
方法:从尾到头!思路与课本差不多,设置两个指针p,q,分别指向原数组和扩充后数组的末尾'\0'.
class Solution { public: void replaceSpace(char *str,int length) { //length:str数组允许的最大容量,不是str数组的实际长度 if(str==nullptr||length<=0) return; int original_length=1;//考虑到数组最后一位是'\0',而在循环中这位不计,所以提前加上1. int blank_length=0,i=0; //遍历数组,得到数组的实际长度和空格个数 while(str[i]!='\0') { original_length++; if(str[i]==' ') blank_length++; i++; } //替换后的新容量,还得判断他是否<=数组允许的最大容量 int new_length=original_length+blank_length*2; if(new_length>length) return; char *p=str+original_length-1;//*p指针指向str最后一位,即结束符‘\0’ char *q=str+new_length-1;//*q指针指向替换后str数组的最后一位 while(p<q) { if(*p!=' ') { *q=*p; } else { *q='0'; *(q-1)='2'; *(q-2)='%'; q=q-2; } --p; --q; } } };
有几点需要注意的:
void replaceSpace(char *str,int length)中的length是str数组所能容纳的最大长度,不是现有字符串的长度;
在遍历字符串时,以while(str[i]!='\0')结束;
注意多种特殊情况:程序开头验证str是否为空,length是否大于0,中途扩充后的数组长度得小于等于最大容量length;
当碰到空格时注意*q与p的处理情况,不能如此:
else { *q='0'; *q--='2'; *q--='%'; }
此时就得分清i--与--i的区别,i--先赋值在i=i-1,--i先i=i-1再赋值。程序里q--='2',先赋值q='2',再计算q=q-1,这样的话‘2’就覆盖了‘0’导致错误。
else { *q='0'; *(q-1)='2'; *(q-2)='%'; q=q-2; }
还得注意(q-1)='2';(q-2)='%';只是赋值操作,得最后q=q-2将q前移进行赋值操作。
所以就还有另一种写法:while(p<q) { if(*p!=' ') { *q--=*p; } else { *q--='0';//先赋值后减1,刚好满足要求。 *q--='2'; *q--='%'; } --p; }