剑指offer——替换空格

题目描述:
  请实现一个函数,将一个字符串中的空格替换成“%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)。
从后向前替换字符串空格位%20的过程
  参考代码如下:

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;
           }
       }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值