【剑指offer】5_1.替换空格

题目描述

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

示例:

输入:s = "We are happy."
输出:"We%20are%20happy."

思路

1.StringBuilder

借助StringBuilder实现

class Solution {
    public String replaceSpace(String s) {
        StringBuilder newStr = new StringBuilder();
        for(int i = 0; i< s.length(); i++){
            if(s.charAt(i) == ' '){
                newStr.append('%');
                newStr.append('2');
                newStr.append('0');
            }else
                newStr.append(s.charAt(i));
        }
        return newStr.toString();
    }
}

2.从后向前遍历

最直观的做法是从头到尾扫描,遇到空格字符进行替换,同时引出来问题:由于1个字符替换成3个字符,会将空格后面的所有字符都向后移动2个字节,否则会发生覆盖。
那么可以从后向前遍历,就不必去移动额外字符。这种做法要求事先计算好替换后的字符长度

class Solution {
    public String replaceSpace(String s) {
        int spaceNum = 0, oldLen = s.length();
        for(int i = 0; i < oldLen; i++){
            if(s.charAt(i) == ' '){
                spaceNum++;
            }
        }

        int newLen = oldLen + 2 * spaceNum;
        int indexNew = newLen - 1;
        StringBuffer str = new StringBuffer();
        str.setLength(newLen);
        for(int j = oldLen - 1; j >= 0; j--){
            if(s.charAt(j) == ' '){
                str.setCharAt(indexNew--, '0'); 
                str.setCharAt(indexNew--, '2'); 
                str.setCharAt(indexNew--, '%'); 
            }else{
                str.setCharAt(indexNew--, s.charAt(j));
            }
        }
        return str.toString();
    }
}

小结

  • 在合并两个数组的时候,如果从前往后复制每个数字则需要移动数字多次,那么可以考虑从后往前复制,这样就可以减少移动的次数,从而提高效率。
  • 处理字符串的时候,StringBuilder提供更多的方法
append(String str)/append(Char c):字符串连接

toString():返回一个内容相同的字符串

setCharAt(int i, char c):将第 i 个代码单元设置为 c(可以理解为替换)

insert(int offset, String str)/insert(int offset, Char c):在指定位置之前插入字符(串)

delete(int startIndex,int endIndex):删除起始位置(含)到结尾位置(不含)之间的字符串
发布了89 篇原创文章 · 获赞 13 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Dawn510/article/details/105086515
今日推荐