跳转至

05.替换空格 (Easy)*

题目描述*

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

网络编程中,url 中含有特殊字符就需要转换成服务器可识别的字符,即 % 加上 ASCII 十六进制表示。

示例*

输入:s = "We are happy."

输出:"We%20are%20happy."

限制*

0 <= s.length() <= 10000

代码*

看起来好像很简单,用 replace 函数或者最基本的字符串拼接即可。

剑指 Offer 上提供了原地修改的算法:

将字符串扩展为替换后的长度,用两个指针 p1 和 p2,分别指向原字符串尾部和扩展后字符串尾部。向前遍历,如果 p1 指向空格,那么 p2 向前填充 02%(逆向),否则填充原字符,当 p1 == p2 或遍历结束时返回。

类似问题:合并两个排序的数组 A 和 B,A 末尾有足够空间容纳 A2。从后往前合并即可。

class Solution {
public:
    string replaceSpace(string s) {
        string res = "";
        for(auto c : s) {
            if(c == ' ') {
                res += "%20";
            }else {
                res += c;
            }
        }
        return res;
    }
};
class Solution {
public:
    string replaceSpace(string s) {
        int len = s.length();
        if(len == 0) {
            return "";
        }
        for(int i = 0; i < len; i++) {
            if(s[i] == ' ') {
                s += "  ";
            }
        }
        int r = s.length() - 1, l = len - 1;
        while(r > l && l >= 0) {
            if(s[l] == ' ') {
                s[r--] = '0';
                s[r--] = '2';
                s[r--] = '%';
            }else {
                s[r--] = s[l];
            }
            l--;
        }
        return s;
    }
};
class Solution {
public:
    void merge(vector<int>& A, int m, vector<int>& B, int n) {
        int pa = m - 1;
        int pb = n - 1;
        int p = m + n -1;
        while(p >= 0 && pa >= 0 && pb >= 0) {
            A[p--] = (A[pa] > B[pb] ? A[pa--] : B[pb--]);
        }
        while(pb >= 0 && p >= 0) {
            A[p--] = B[pb--];
        }
    }
};

最后更新: July 23, 2022