Loading

力扣 - 剑指 Offer 05. 替换空格

题目

剑指 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';
            } else {
                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)\)
posted @ 2021-10-17 21:12  linzeliang  阅读(70)  评论(0)    收藏  举报