剑指offer-4.替换空格

https://www.nowcoder.com/practice/4060ac7e3e404ad1a894ef3e17650423?tpId=13&tqId=11155&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

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

要求:不能使用格外的数组,时间复杂度为 O(n)

题解:
每次遇到空格需要增加两个位置,如果从前往后移动,可能导致元素被多次移动,时间复杂度为 O(n^2)
所以采用统计空格总数量,计算最终数组总长度,然后从最末尾开始向后移动,可以直接移动到最终位置,每个字符只需移动一次,时间复杂度为 O(n)

class Solution {
    public String replaceSpace(StringBuffer str) {
        if (str == null || str.length() == 0) {
            return "";
        }
        int spaceCount = 0;
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == ' ') {
                spaceCount++;
            }
        }
        if (spaceCount == 0) {
            return str.toString();
        }
        int indexold = str.length() - 1;// 指向旧字符串末尾元素下标
        int indexnew = str.length() + 2 * spaceCount - 1;// 指向新字符串末尾元素下标
        str.setLength(str.length() + 2 * spaceCount);// 设置新长度,防止下标越界
        while (indexold >= 0 && indexold <= indexnew) {//注意这里 如果indexold > indexnew,则说明后面的不用移动了
            if (str.charAt(indexold) == ' ') {
                str.setCharAt(indexnew--, '0');
                str.setCharAt(indexnew--, '2');
                str.setCharAt(indexnew--, '%');
            } else {
                str.setCharAt(indexnew--, str.charAt(indexold--));
            }
        }
        return str.toString();
    }
}

相关题目:
有两个排序的数组A1和A2,内存在A1的末尾有足够多的空余空间容纳A2。请实现一个函数,把A2中的所有数字插入到A1中并且所有的数字是排序的。

和前面例题一样,从前往后插入,会出现多次复制一个数字的情况。更好的办法是从尾到头比较A1和A2中的数字,并把较大的数字复制到A1的合适位置。

猜你喜欢

转载自blog.csdn.net/zxm1306192988/article/details/80770233
今日推荐