• 剑指offer 04. 替换空格


    【剑指offer系列题解】

    【题目地址】

    题目描述

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

    数据范围

    0≤ 输入字符串的长度 ≤1000。
    注意输出字符串的长度可能大于 1000。

    样例

    输入:"We are happy."
    
    输出:"We%20are%20happy."
    
    • 1
    • 2
    • 3

    方法一:STL O(n)

    我们可以利用 c++string 自带的函数 findreplace 解决该题,注意使用规范:

    • find函数的返回值是整数,假如字符串存在包含关系,其返回值必定不等于npos ,而是返回查找的字符串在该字符串中出现的下标。但如果字符串不存在包含关系,那么返回值一定是 npos 。所以这里要用一个 size_t 类型的变量来接收返回值。
    • replace 函数的一个参数代表要开始替换的下标位置,第二个参数代表要替换字符串中多少个字符,第三个参数是要替换进去的字符串。
    class Solution {
    public:
        string replaceSpaces(string& str) {
            size_t t;
            while ((t = str.find(' ')) != string::npos) {
                str.replace(t, 1, "%20");
            }
            return str;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    方法二:线性扫描 O(n)

    另外开一个字符串数组用于存储答案,然后从头往后遍历 str ,如果遇到空格就换成 "%20" 加到 res 中即可。

    class Solution {
    public:
        string replaceSpaces(string& str) {
            string res = "";
            for (auto x : str)
            {
                if (x == ' ')
                    res += "%20";
                else
                    res += x;
            }
            return res;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    方法三:双指针 O(n)

    我们可以优化一下空间复杂度,直接在原数组中进行修改:

    第一步: 先遍历数组计算最终需要多少个字,如果是空格长度就加 3 ,因为最终一个空格要替换成三个字符;如果是其它字符,就正常加 1

    在这里插入图片描述

    第二步:str 进行 resize ,重新定义字符串数组的长度。

    在这里插入图片描述

    第三步: 从后往前遍历,如果不是空格,就将 i 处的字符移到 j 处;如果是空格,则将空格当做三个字符进行替换,这里要注意的是要按照 02% 赋值,这样正序输出时才是 %20

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    class Solution {
    public:
        string replaceSpaces(string& str) {
            //先计算最终数组的长度
            int len = 0;
            for (auto x : str)
                if (x == ' ')  len += 3;
                else    len++;
    
            int i = str.size() - 1, j = len - 1;
    
            str.resize(len);    //修改数组长度
    
            //从后往前遍历
            while (i >= 0)
            {
                //如果遇到空格,倒过来放入数组即可
                if (str[i] == ' ')
                {
                    str[j--] = '0';
                    str[j--] = '2';
                    str[j--] = '%';
                }
                else    str[j--] = str[i];
                i--;
            }
            return str;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    欢迎大家在评论区交流~

  • 相关阅读:
    某蝶EAS(Enterprise Application Suite)平台myUploadFile接口任意文件上传漏洞复现 CNVD-2023-57598
    全网最细的SpringBoot3系列教程
    PHP微服务 hyperf+nacos使用
    节省50%成本!京东云重磅发布新一代混合CDN产品
    运算方法和运算器
    【无标题】右键菜单
    CentOS常见的命令
    架构师幻想之路-从负数到零-2
    朝阳药品数据分析案例
    【圣诞文】用python带你体验多重花样圣诞树
  • 原文地址:https://blog.csdn.net/Newin2020/article/details/126062543