剑指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(); } }