• 剑指 Offer 05. 替换空格


    题目描述

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

    解题思路

    方法一:使用额外空间

            使用额外的空间存储替换后的字符串,逐个字符遍历原始字符串,如果遇到空格就用"%20",其他字符就直接复制到新的字符串中,结果返回新字符串。

            需要遍历整个字符串,因此时间复杂度是O(n);需要额外空间存储新的字符串,因此空间复杂度是O(n)。

    方法二:原地替换(从后向前遍历)

            这种方法可以在不使用额外空间的情况下完成替换。首先计算出替换后的字符串长度,然后从原字符串的末尾开始遍历,遇到非空格字符则复制到新的位置,遇到空格则替换为"%20"。由于是从后往前遍历,不会覆盖未处理的字符。

            之所以从后往前复制是为了避免覆盖未复制的字符,如果从前往后复制,当将一个字符移动到新的位置时,原始字符会被覆盖,导致信息丢失或紊乱。通过resize函数将原始字符串扩充空间会在字符串末尾开辟出新的空间,由于是新开辟的,没有任何数据,不会影响到其他字符。

            遍历整个字符串两次,时间复杂度是O(n);原地替换不需要使用额外的空间,空间复杂度是O(1)。

    代码及结果

    使用额外空间

    1. std::string Solution::replaceSpace(std::string s)
    2. {
    3. std::string result = "";
    4. std::string temp = "%20";
    5. for (char c : s)
    6. {
    7. if (c == ' ')
    8. result += temp;
    9. else
    10. result += c;
    11. }
    12. return result;
    13. }

     

    原地替换(从后向前遍历)

    1. std::string Solution::replaceSpace(std::string s)
    2. {
    3. int spaceCount = 0;
    4. for (char c : s)
    5. {
    6. if (c == ' ')
    7. spaceCount++;
    8. }
    9. int oldLength = s.length();
    10. int newLength = oldLength + spaceCount * 2;
    11. s.resize(newLength);
    12. for (int i = oldLength - 1, j = newLength - 1; i >= 0; i--)
    13. {
    14. if (s[i] == ' ')
    15. {
    16. s[j--] = '0';
    17. s[j--] = '2';
    18. s[j--] = '%';
    19. }
    20. else
    21. s[j--] = s[i];
    22. }
    23. return s;
    24. }

  • 相关阅读:
    spring中事件的使用方法
    [Jenkins] 物理机 安装 Jenkins
    Java多态详解
    dubbo:两种方式安装dubbo-admin、zookeeper
    分析Python爬虫设计
    爬虫 — Scrapy-Redis
    在RK3588开发板使用FFMpeg 结合云服务器加SRS实现摄像头数据推流到云端拱其他设备查看
    RK3568 SPI子系统–oled屏
    9.21号作业
    Android打造专有hook第二篇,走进规范第一步
  • 原文地址:https://blog.csdn.net/pan_1214_/article/details/132730077