《剑指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];               
        }
    }

猜你喜欢

转载自blog.csdn.net/acelove40/article/details/79791305