剑指 Offer 05. 替换空格

    科技2025-07-11  17

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

    示例 1:

    输入:s = "We are happy." 输出:"We%20are%20happy." 限制: 0 <= s 的长度 <= 10000

    思路

    第一反应是将字符串往后复制,替换时所有的字符串都向后复制两个字节,但这种方法时间复杂度为O(n²)。(一共n个字符,对于每个字符来说,需要移动后面O(n)个字符。)

    **优化时间复杂度,使时间复杂度变为O(n)。**首先遍历一次字符串,得到字符串长度(p1),遍历时可查出有多少个空格,对应的每次替换一个空格字符串长度应该增加2,得到新的字符串长度(p2)。设置两个指针p1,p2:p1指向原字符串长度的位置,p2指向增加字符串长度后新字符串的尾端位置。 p1向前移动,当不是空格时将字符复制到p2指针处,并且p2也向前移动;当p1读到空格时,在p2处依次往前写‘0’‘2’‘%’,直到p1与p2位置重合,算法结束。

    注意的问题以及补充新的知识点 1、LeetCode中字符串用的类型是String: String类型会大量浪费内存空间,改用StringBuffer类更好。String、StringBuffer和StringBuilder的区别见总结博客https://blog.csdn.net/yayayayayan/article/details/108960115 2、将String类型转换为StringBuffer: 见总结博客https://blog.csdn.net/yayayayayan/article/details/108960525


    代码实现

    public String replaceSpace(String s) { StringBuffer str = new StringBuffer(); str.append(s); int p1 = str.length() - 1;//p1指针指向原字符串结尾 for(int i = 0; i <= p1; i++){ if(str.charAt(i) == ' '){ str.append(" ");//在字符串后加两个空格 } } int p2 = str.length() - 1;//p2指针指向新复制的字符串结尾 while(p1 < p2 && p1 >= 0){ char c = str.charAt(p1--); if(c == ' '){ str.setCharAt(p2--, '0'); str.setCharAt(p2--, '2'); str.setCharAt(p2--, '%'); }else{ str.setCharAt(p2--, c); } } return str.toString();//将StringBuffer转换成String类型输出 }
    Processed: 0.011, SQL: 8