思路及其优缺点

  • 开辟String类或者Stringbuild,直接添加; 缺点在于增加了空间复杂度,优点思路简单,编程简单
  • 直接在StringBuffer上修改,StringBuffer(StringBuild)本质上是一个数组,首先扩充数组,从后往前把字符复制到后面。但是需要统计空格数,所以需要遍历两次数组,时间复杂度换来了空间复杂度。另外一个缺点编程代码更长,考虑更多

代码

开辟新数组

public class Solution {
    public String replaceSpace(StringBuffer str) {
        String res="";
        for(int i=0;i<str.length();i++){
            if(str.charAt(i)==' '){
                res+="%20";
            }else{
                res+=str.charAt(i);
            }
        }
        return res;
    }
}

直接替换

public class Solution {
   public static String replaceSpace(StringBuffer str){
                // 保存当前长度,计算扩充后的长度
        int len = 0, tempLen = str.length();
        for(int i = 0; i < str.length(); i++){
            if(str.charAt(i) == ' '){
                len += 3;
            }else{
                len += 1;
            }
        }
                //扩充数组
        str.setLength(len);
        len--;  //数组下标从0开始,最后一个元素是len-1
//        System.out.println(len);
//        System.out.println(tempLen);
                // 移动元素,从后往前把字符复制到后面,
                // 这里还可以优化,即复制完第一个空格就可以终止循环了
        for(int i = tempLen-1; i >= 0; i--){
            if(str.charAt(i) == ' '){
                str.setCharAt(len, '0');
                len--;
                str.setCharAt(len, '2');
                len--;
                str.setCharAt(len, '%');
                len--;
            }else{
                str.setCharAt(len, str.charAt(i));
                len--;
            }
        }
        return str.toString();
    }
}