力扣 剑指 Offer 05. 替换空格

作者: linzeliang

题目

剑指 Offer 05. 替换空格

思路1

  • 使用辅助数组,边遍历变添加

  • 遇到空格,将空格替换为%20

    代码

class Solution {
    public String replaceSpace(String s) {
        int length = s.length();
        char[] temp = new char[length*3];
        int p = 0;

        for (char c : s.toCharArray()) {
            if (c == ' ') {
                temp[p++] = '%';
                temp[p++] = '2';
                temp[p++] = '0';
                temp[p++] = c;
            }
        }

        return new String(temp, 0, p);
    }
}

复杂度分析

  • 时间复杂度:\(O(N)\)
  • 空间复杂度:\(O(N)\)

思路2

  • 因为Java和Python的字符串都是不可变的,所以只能创建辅助数组,但是C/C++的字符串是可变的,因此们可以原地修改

  • 先扩展字符串的长度:首先遍历一遍字符串获取总空格的个数,所以新字符串的长度为原字符串长度 + 空格数*2

  • 们扩展的空间刚刚好够们原地遍历。首先们用两个指针p1、p2,p1指向原来字符串的末尾和p2指向扩展后的字符串的末尾,从后往前遍历,遇到非空格的直接复制过去,两个指针同时前移一步;遇到空格p1前移一步,p2前移3步,依次填入02%,直到到达字符串的首部完成替换!

    代码

class Solution {
public:
    string replaceSpace(string s) {
        int count = 0, len = s.size();
        // 统计空格数量
        for (char c : s) {
            if (c == ' ') count++;
        }
        // 修改 s 长度
        s.resize(len + 2 * count);
        // 倒序遍历修改
        for(int i = len - 1, j = s.size() - 1; i < j; i--, j--) {
            if (s[i] != ' ')
                s[j] = s[i];
            else {
                s[j - 2] = '%';
                s[j - 1] = '2';
                s[j] = '0';
                j -= 2;
            }
        }
        return s;
    }
};

复杂度分析

  • 时间复杂度:\(O(N)\)
  • 空间复杂度:\(O(1)\)

    原文创作:linzeliang

    原文链接:https://www.cnblogs.com/linzeliang1222/p/15418177.html

更多推荐

更多
这里什么都没有

近期文章

更多
文章目录

    推荐作者

    更多