剑指offer —— 替换空格

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

2.思路:可能首先想到的应该就是  str.replaceAll("\\s", "%20"),在工作当中肯定可以这样写,但是如果是面试的话,主要考的是编程能力,而不是熟悉API的程度;

             一种想法是在原有的字符串进行替换,但是只适用于在替换字符的长度和被替换字符长度一致时,才可以使用;

            另一种想法是在 先计算替换之后字符串的长度,再新建一个字符串,用来存放替换之后的字符串,这里采用这种方式;

3.代码:

①:不使用 StringBuilder 和 StringBuffer

    public String replaceSpace(String s) {
        //1.判断有多少空格
        int spaceNum = 0;
        for(int i = 0 ; i < s.length();i++){
            if(s.charAt(i) == ' '){
                spaceNum++;
            }
        }
        
        if(spaceNum != 0){
            //2.需要的长度
            int newLen = s.length() + 2 * spaceNum;
            char[] newChars = new char[newLen];
            int position = 0;

            //3.开始替换
            for(int i = 0  ; i < s.length() ; i++){
                if(s.charAt(i) == ' '){
                   newChars[position++] = '%';
                   newChars[position++] = '2';
                   newChars[position++] = '0'; 
                }else{
                   newChars[position++] = s.charAt(i); 
                }
            }
            
            s = new String(newChars);
        }
      
        return s;
    }

②使用 StringBuffer

    public String replaceSpace(StringBuffer str) {
        
        //1.判断有多少空格
        int spaceNum = 0 ;
        for(int i = 0 ; i < str.length();i++){
            if(str.charAt(i) == ' '){
                spaceNum++;
            }
        }
        
        if(spaceNum != 0){
            //2.需要的长度
            int oldLen = str.length();
            int newLen = oldLen + 2 * spaceNum;
            str.setLength(newLen);
            int position = newLen - 1;
            
            //3.开始替换,从后往前移动,每次则只移动一个字符
            for(int i = oldLen - 1 ; i >= 0 ; i-- ){
                if(str.charAt(i) == ' '){
                    str.setCharAt(position-- , '0');
                    str.setCharAt(position-- , '2');
                    str.setCharAt(position-- , '%');
                }else{
                    str.setCharAt(position-- , str.charAt(i));
                }
            }
        }
        
        return str.toString();
    }

③使用 StringBuilder

 public String replaceSpace(StringBuffer str) {
        if(str == null){
            return null;
        }
        StringBuilder sb = new StringBuilder();
        for(int i = 0 ; i < str.length();i++){
            if(str.charAt(i) == ' '){
                sb.append('%');
                sb.append('2');
                sb.append('0');
            }else{
                sb.append(str.charAt(i));
            }
        }
        return sb.toString();
    }

猜你喜欢

转载自www.cnblogs.com/shulipeng/p/8990708.html
今日推荐