剑指Offter——替换空格

297 阅读2分钟

题目:替换空格

实现一个函数,把字符串中的每个空格替换成“%20”,例如:输入“we are happy.”,则输出"we%20are%20happy."

解题思路

思路一:

替换空格,这个还不简单,遍历整个整个字符串,每次碰到空格字符的时候直接进行替换就好了。这个当然能达到效果,但是想想"we"后面有空格,当替换成“%20”后,后面所有的字符都需要向后移动两个字节。当整个字符串长度为n的时候,那么时间复杂度为 O(n^2);

我们有没有更加好的方式去解这个题呢?

思路二:

首先遍历整个字符串,查找出总共有多少个空格,这样同时能得出替换后字符串的长度。每替换一个空格,长度都会增加2,这样替换后的长度=原长度+2*空格数。接下来进行复制和替换工作。首先准备两个指针:p1和p2,p1指向原始支付串的末尾,p2则指向替换之后的字符串的末尾;接下来移动指针,直到碰到第一个空格后,p1向前移动1格,在p2之前插入字符串"%20",由于“%20”的长度是3,则p2需要向前移动3格。依次向前移动,直到p1和p2指向同一位置。这样所有的字符只移动一次,算法的时间效率为O(n)。

解题代码


    public static String replaceBlank(String target) {
        if (target.equals("") ) return target;
        char[] charTarget = target.toCharArray();
        int i = 0;
        int lengthSpace = 0;
        // 计算出总共的空格个数
        while (i < charTarget.length) {
            if (charTarget[i] == ' ' ) {
                lengthSpace++;
            }
            i++;
        }
        int newCharTargetLength = charTarget.length + lengthSpace * 2;
        char[] newCharTarget = new char[newCharTargetLength];
        // 定义两个位置的指针
        int j = newCharTargetLength - 1;
        i = charTarget.length - 1;
        while (i >= 0) {
            if (charTarget[i] != ' ') {
                newCharTarget[j--] = charTarget[i--];
                System.out.println("J的值: = [" + j + "]");
            } else {
                newCharTarget[j--] = '0';
                newCharTarget[j--] = '2';
                newCharTarget[j--] = '%';
                i--;
            }
        }
        return new String(newCharTarget);
    }

源码链接

后记

  • 摘自《剑指Offter》
  • 牛客网