题目:请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
刚看到题目时我的想法就是新建一个字符数组,然后遍历旧的字符串时判断一下,如果不为空格字符就直接复制给新字符数组,否则就讲%20复制给新字符数组,但是假如仅仅让在原来的字符串上做替换的话,又该如何做呢。
测试通过代码如下:
class Solution {
public:
void replaceSpace(char *str,int length) {
int count=0,oldLength=0,newLength=0,i=0;
while(*(str+i)!='\0'){
oldLength++;
if(*(str+i)==' '){
count++;
}
i++;
}
newLength=oldLength+count*2;
if(newLength>length)
return;
while(newLength>oldLength&&oldLength>=0){
if(str[oldLength]==' '){
str[newLength--]='0';
str[newLength--]='2';
str[newLength--]='%';
}
else{
str[newLength--]=str[oldLength];
}
oldLength--;
}
}
};
总结:
1、首先做的时候仅仅考虑了从前往后检测字符串,发现空格就添加‘%20’,但是这样复杂度很高,为o(n^2)。但是如果从后往前检测就大大降低了复杂度。从这点可以学到很多题目其实就是稍微转换一下思路就可以得到很好的效果。比如从前往后看不行,就想想从后往前看是不是能行或者说更好。
2、在判断不为空格时,就将前面指针的值赋值给后面指针,然后我做的时候就新建了两个字符指针,这也是没有必要的,因为字符数组在内存中是连续存放的,所以访问时直接可以由下面得到值,这样更方便。
3、其次上面程序忘记了判断输入字符串是否为空或者说字符指针是NULL指针。当输入为字符串的时候,需要记着判断字符串是否为NULL,字符串是否是个空字符串。当然针对本题还需要想到字符串只有一个空格怎么办或者只有连续多个空格怎么办。
4、还有一点需要注意,函数的输出length并不是str内容的长度,也就是说在‘\0’后面可能还有很多的空间,想要求得str内容的长度还需遍历一下str。
5、通过做这一道题发现自己对字符串操作的基础还不够扎实,这篇文章总结了字符指针和字符数组的一些区别与联系,很全面。
http://www.cnblogs.com/GODYCA/archive/2013/01/31/2888331.html
6、这篇文章总结了字符串操作的相关函数。
http://blog.youkuaiyun.com/cbnotes/article/details/50291353