剑指offer之替换空格

题目描述

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

当看到这个题时,我的第一个反应就是创建一个新的数组,大小刚好是原来数组的长度加上空格数*3。

  • 先创建新数组
  • 然后将字符串一个字符一个字符拷贝
  • 当遇到空格则添加为%20,然后继续拷贝
  • 重复以上过程,直到字符串结束

但是,如果题目不让你创建新的空间怎么办?

 你可能会说,没事,我还有一种方法,就是从头到尾遍历一遍。

  • 从头到尾遍历一遍
  • 当遇到空格,我就把后边的字符都统统往后挪两个
  • 然后将空格处替换成%20
  • 重复以上步骤

这样也是没有创建新的空间,但是这样的时间复杂度是O(n^2)

接下来我来说一个时间复杂度为O(n)的方法,但是前提是原来的空间要足够。

  • 我们可以先遍历一次字符串,这样就可以统计出字符串空格的总数,并可以由此计算出替换之后的字符串的总长度。
  • 我们从字符串的尾部开始复制和替换。
  • 首先准备两个指针,P1和P2,P1指向原始字符串的末尾,而P2指向替换之后的字符串的末尾。
  • 然后我们向前移动指针P1,逐个把它指向的字符复制到P2指向的位置,直到碰到第一个空格为止。
  • 碰到第一个空格之后,把P1向前移动1格,在P2之前插入字符串"%20"。由于"%20"的长度为3,同时也要把P2向前移动3格。
  • 重复上述步骤

接下来,就用代码来实现一下:

class Solution {
public:
	void replaceSpace(char *str,int length) {
        if(str == NULL && length <= 0){
            return;
        }
        /*rellen为字符串str的实际长度*/
        int rellen = 0;			//原始长度
        int blank = 0;				//空格数
        int i;
        while(str[i++] != '\0'){				//遍历字符串
            ++rellen;				//长度+1
            if(str[i] == ' '){
                ++blank;				//遇到空格+1
            }
        }
        /*new_length为把空格替换成'%20'之后的长度*/
        int newlen = rellen + 2 * blank;
        
        int index_old = rellen;	//原始字符串末尾索引值
        int index_new = newlen;				//计算长度后的字符串末尾索引值
        
        /*index_old指针开始向前移动,如果遇到空格,替换成'%20',否则进行复制操作*/
        while(index_old >= 0 && index_new > index_old){
            if(str[index_old] == ' '){
                str[index_new--] = '0';
                str[index_new--] = '2';
                str[index_new--] = '%';
            }
            else{
                str[index_new--] = str[index_old];
            }
            --index_old;
        }
	}
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值