• 00002.替换空格
  • 发布于 1个月前
  • 40 热度
    1 评论

题目描述:

请实现一个函数,将一个字符串中的每个空格替换成 “%20”。例如,当字符串为 We Are Happy. 则经过替换之后的字符串为 We%20Are%20Happy。


解题思路1:

第一反应,JAVA存在对应API,String里面的replaceAll(String regex, String replacement);第一个参数匹配的正则,第二个要替换的文本。题目是每个空格,所以不能用匹配的正则' + '。


public class Solution {
    public String replaceSpace(StringBuffer str) {
        return str.toString().replaceAll("\\s", "%20");
    }
}
开发中这样写,完全没问题,面试这样你拿到offer我跟你姓。



解题思路2:

不逼逼,刷题的时候,看到String相关的问题,第一反应都是先转成字符数组然后遍历,之后进行对比,然后操作。一般这样对于大多数来说是成立且OK的。


public class Solution {
    public String replaceSpace(StringBuffer str) {
        StringBuffer out=new StringBuffer();
        int strLength = str.toString().length();
        for (int i = 0; i < strLength; i++) {
            char ch =str.charAt(i);
            if(ch == ' '){
                out.append("%20");
            }else{
                out.append(b);
            }
        }
        return out.toString();     
    }
}


append方法你点进源码就会看到,最终复制的时候都会调用System.arraycopy( )这个方法,说明每次都是copy阿,肯定很慢,而且每次copy必定会遍历。

解题思路3:

嫌弃慢是因为每次都是正向在copy,替换的时候每次都是从左往右替换,所以要移动的比较多,能解决移动的数多这个问题便是从后往前替换,从前往后计算。

public class Solution {
    public String replaceSpace(StringBuffer str) {
        int blankCount = 0;
        for(int i = 0; i < str.length(); i++) {
            if(str.charAt(i) == ' ') {
                ++blankCount;
            }
        }
        //旧数组中最后一个元素的索引
        int indexOldLast = str.length() - 1;
        //新数组中最后一个元素的索引
        int indexNewLast = str.length()+ blankCount * 2 - 1;
        //设置新数组的长度
        str.setLength(indexNewLast + 1);
        while(indexNewLast > 0) {
            if(str.charAt(indexOldLast) == ' ') {
                str.setCharAt(indexNewLast--,'0');
                str.setCharAt(indexNewLast--,'2');
                str.setCharAt(indexNewLast--,'%');
        //每次替换完之后都要左移
            } else {
               str.setCharAt(indexNewLast--,str.charAt(indexOldLast)); 
            }
        //无论如何都要减
            --indexOldLast;
        }
        return str.toString();
    }
}
解题思路:正向取长度,反向去替换。


用户评论