很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。
- 不用申请新数组。
- 从后向前填充元素,避免了从前先后填充元素要来的 每次添加元素都要将添加元素之后的所有元素向后移动。
//方式二:双指针法 public String replaceSpace(String s) { if(s == null || s.length() == 0){ return s; } //扩充空间,空格数量2倍,和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
//选用 StringBuilder 单线程使用,比较快 StringBuilder str = new StringBuilder(); for (int i = 0; i < s.length(); i++) { if(s.charAt(i) == ' '){ str.append(" "); } } //若是没有空格直接返回 if(str.length() == 0){ return s; } //有空格情况 定义两个指针 int left = s.length() - 1;//左指针:指向原始字符串最后一个位置 s += str.toString(); int right = s.length()-1;//右指针:指向扩展字符串的最后一个位置 char[] chars = s.toCharArray(); while(left>=0){ if(chars[left] == ' '){ chars[right--] = '0'; chars[right--] = '2'; chars[right] = '%'; }else{ chars[right] = chars[left]; } left--; right--; } return new String(chars); }