总结:
- 思路:扩容后,从后向前扫描,设置两个指针,从而减少从前往后的移动次数
1 /*面试题5:时间复杂度O(n) 2 请实现一个函数,将一个字符串中的空格替换成“%20”。 3 例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy 4 */ 5 /* 6 思路:先扫描一遍,记录空格个数 7 根据空格个数设置新的字符串长度, 8 设置两个指针index(原字符串尾部开始)和indexNum(新字符串尾部开始), 9 (两个指针同时从后向前移动)判断当前index是否为空格,是的话indexNum增添20%,不是的话复制原字符 10 */ 11 public class ReplaceSpace { 12 public static String replaceSpace(StringBuffer str){ 13 int len = str.length(); 14 int spaceNum = 0; 15 for (int i = 0;i < len;i++){ 16 if(str.charAt(i) == ' ') spaceNum++; 17 } 18 int index = len - 1,indexNew = len + 2*spaceNum - 1; 19 str.setLength(indexNew+1);//注意长度 20 for (;index >= 0;index--){ 21 if(str.charAt(index) == ' '){ 22 str.setCharAt(indexNew--,'0'); 23 str.setCharAt(indexNew--,'2'); 24 str.setCharAt(indexNew--,'%'); 25 } 26 else str.setCharAt(indexNew--,str.charAt(index)); 27 } 28 return str.toString(); 29 30 } 31 public static void main(String args[]){ 32 StringBuffer str = new StringBuffer(); 33 Scanner cin = new Scanner(System.in); 34 str.append(cin.nextLine()); 35 System.out.println(replaceSpace(str)); 36 } 37 }