空格替换

题目:
请实现一个函数,把字符串中的每一个空格替换成“%20”。例如输入“We are happy.”,则输出“We%20are%20happy.”
看到这道题目,我们最开始的思路肯定是从头到尾扫描字符串,遇到空格就将它与%20相替换。但是由于是一个字符替换成3个字符,那么我们就必须将空格后面所有的字符都后移2个字节,如此算来,时间复杂度会是n^2。
如何减少时间复杂度呢?首先我们可以先遍历一遍字符串,获得字符串的总长和空格数,然后我们就知道新的字符串的长度是多少,接着我们从字符串的后面开始复制和替换。
如何复制和替换呢?很简单,我们已经知道了原字符串的长度和新的字符串的长度,那么我们准备2个指针P1,P2,分别指向原字符串的尾部和新字符串的尾部,将P1的内容复制到P2处,如果P1为空格,P2分别添加‘0’‘2’‘%’当P1、P2指向同一个位置的时候,就说明所有的空格都替换完毕啦。
如图所示:
这里写图片描述

代码实现:
    void ReplaceBlank(char str[],int length)    
    //length is the len of str[]
    {
        if(str==nullptr||length<=0)
            return;
        int original_len=0;
        int blank_num=0;
        int i=0;
        while(str[i]!='\0')
        {
            original_len++;
            if(str[i]==' ')
                blank_num++;
            i++;
        }
        int new_len=original_len+blank_num*2;
        int original_index=original_len;
        int new_index=new_len;
        while(original_index>=0&&new_index>original_index)
        {
            if(str[original_index]==' ')
            {
                str[new_index--]='0';
                str[new_index--]='2';
                str[new_index--]='%';
            }else{
                str[new_index--]=str[original_index];
            }
            original_index--;
        }
    }

我们可以看出,虽然前面要先遍历一遍,但是我们这个算法的时间复杂度是O(n)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值