剑指offer-替换空格

 

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

思路一:从左向右扫描字符串替换

  • 一个字符替换为三个
  • 每遇到一个空格,空格后面所有字符向右移动两个位置
  • 字符串长度为n, 对每个空格而言,需要移动后面O(n)个字符
  • 算法的时间复杂度为O(n^2)
思路二:从右到左扫描字符串替换
  • 统计空格数,字符串长度增加 空格数 * 2
  • 维持两个指针p1, p2
  • p1指向原字符串长度末尾, p2指向新字符串长度末尾
  • 当p1遇到空格时, p2 向前移动并替换字符为 '0' '2' '%'
  • 把p1指针指向的字符拷贝到p2指针指向的字符
  • 所有字符都只移动一次,时间复杂度为O(n)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        // 空格的个数
        int spaceNum = 0;
        // 遍历查找空格的个数
        for(int i=0; i<str.length(); i++) {
            if(str.charAt(i) == ' ') {
                spaceNum ++;
            }
        }
        int indexOld = str.length() - 1;  // 原字符串下标
        int indexNew =  str.length() + 2 * spaceNum - 1; // 新字符串下标
        str.setLength(indexNew+1);   // 设置新的str长度
        while (indexOld >= 0 ) {
            if(str.charAt(indexOld) == ' ') {
                str.setCharAt(indexNew--, '0');
                str.setCharAt(indexNew--, '2');
                str.setCharAt(indexNew--, '%');
            } else {
                str.setCharAt(indexNew--, str.charAt(indexOld));
            }
            indexOld --;
        }
        return str.toString();
        
    } 
}
原文地址:https://www.cnblogs.com/zywu/p/5756838.html