《剑指offer》面试题5:替换空格

题目:实现一个函数,将字符串中的每个空格替换成字符串“%20”。

解题思路1

使用暴力的方法,从左到右扫描一遍,当遇到空格时就把空格替换成“%20”,然后把空格后面的字符都后移2个位置。由于需要整个字符串扫描一遍,时间为O(n),替换空格时移动字符的时间复杂度为O(n),因此总的时间复杂度为O(n^2)。

解题思路2

因为每个空格会替换成一个三个字符的字符串,因此替换后的新字符串的长度是可知的。从前往后替换最耗时的操作是后移字符,那么就可以转换思维,从后往前替换,每次替换就不需要移动其他字符,时间复杂度为O(1)。因此需要的操作是

  1. 扫描一遍字符串,统计空格个数算出新字符串长度从而得到新字符串末尾的位置,时间为O(n)
  2. 从后往左扫描字符串,将空格替换成字符串“%20”

因此,总的时间复杂度为O(n)。这种从前往后难,从后往前易的思维可以迁移到其他类似问题中:

  • 将有序数组B合并到有序数组A中,因为数字总数已知,就可以从右往左插入。
  • 大数乘法,结果的位数不会超过两个数位数之和,因此可以新建一个长度为两数位数之和的字符串作为结果,在结果字符串上进行操作。
    void replaceSpace(char *str,int length) {
        if (str==nullptr || length<=0)
            return;

        int p = length;

        for (int i=0;i<length;i++)
            if (str[i]==' ')
                p += 2;

        str[p--] = '\0';
        for (int i=length-1;i>=0;i--){
            if (str[i]==' '){
                str[p--] = '0';
                str[p--] = '2';
                str[p--] = '%';
            }
            else
                str[p--] = str[i];               
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值