您的位置:首页 > Web前端

剑指offer——替换空格

2018-02-27 13:29 211 查看
题目描述:

  请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

题目分析:

  拿到题目后,我们很容易想到从前向后遍历字符串,找到空格后,进行替换。因为将空格替换为“%20”,一个字符变为了三个字符,所以要将空格后面的字符均向后移动,否则就有两个字符被覆盖了。但是这种解决办法存在大量的移动,效率较低。例如:假设字符串的长度为n,对每个空格字符,需要移动后面的O(n)个字符,因此对含有O(n)个空格字符的字符串而言总的时间效率是O(n2)。

  显然这样的解法不能满足面试官的要求,寻找一种时间复杂度更小的解法。

  我们可以先遍历一次字符串得到字符串中空格字符的个数,计算得到替换后的总字符长度。每替换一个空格,字符串的长度加2。在替换过程中,从后向前依次遍历进行赋值和替换工作。首先准备两个指针,P1和P2。P1指向原始字符串的末尾,而P2指向替换之后字符串的末尾。向前移动P1指针,逐个把它复制到P2指向的位置,直到碰到第一个空格为止。当碰到第一个空格后,P2之前插入“%20”,P2的值减3。当P1与P2指向同一位置时,表示所有空格已经替换完毕。从分析看出,所有字符仅仅移动一次,所以时间效率为O(n)。



  参考代码如下:

void replaceSpace(char *str,int length) {
int strlen = length;
int i;

for(i = 0; str[i]; i++) {
if(str[i] == ' '){
strlen += 2;
}
}
for(i = length-1; i >= 0; i--) {
if(str[i] != ' ') {
str[strlen-1] = str[i];
strlen--;
} else {
str[strlen-1] = '0';
str[strlen-2] = '2';
str[strlen-3] = '%';
strlen-=3;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  学习 剑指offer