public class Solution { public String replaceSpace(StringBuffer str) { StringBuilder ans = new StringBuilder(); for (int i = 0; i < str.length(); i++) { if (str.charAt(i) == ' '){ ans.append("%20"); }else { ans.append(str.charAt(i)); } } return ans.toString(); } }
public class Solution { public String replaceSpace(StringBuffer str) { int oldStrLength = 0; int spaceCount = 0; for (int i = 0; i < str.length(); i++) { oldStrLength ++; if (str.charAt(i) == ' ') { spaceCount ++; } } int newLength = oldStrLength + spaceCount * 2; str.setLength(newLength); newLength--; for (int i = oldStrLength - 1; i >= 0; i--) { if (str.charAt(i) != ' ') { str.setCharAt(newLength--, str.charAt(i)); } else { str.setCharAt(newLength--, '0'); str.setCharAt(newLength--, '2'); str.setCharAt(newLength--, '%'); } } return str.toString(); } }
借鉴了别人的思路: 这里主要考察String和StringBuffer相互转换 String转换字符串数组,注意边界条件 核心代码i < str.toString().toCharArray().length主要是将字符缓冲流转换成字符串再转换成字符串数组,这样可以遍历字符串数组,
另设字符缓冲流对象s1,即不改变原有字符数组下表索引来操作,两条线,一条逐步遍历字符串数组,
一条当遇到字符串数组中等于空格的字符,停下对新建的字符缓冲流进行拼接%20,若不等于空格则拼接
对应字符串数组的元素。
public String replaceSpace(StringBuffer str) { StringBuffer s1 = new StringBuffer(); for(int i = 0;i < str.toString().toCharArray().length;i++){ char b = str.charAt(i); if(String.valueOf(b).equals(" ")){ s1.append("%20"); }else{ s1.append(b); } } return s1.toString(); }
public class Solution { public String replaceSpace(StringBuffer str) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < str.length(); i++){ if (str.charAt(i) == ' ') { sb.append("%20"); }else { sb.append(str.charAt(i)); } } return sb.toString(); } }
public class Solution { public String replaceSpace (StringBuffer str) { // 空字符串或者长度为0的字符串无需处理 if (str == null || str.length() == 0) return str.toString(); // 记录有多少需要替换的空格 int spaceCount = 0; // 记录原字符串长度 int oldLength = str.length(); for (int i = 0; i < oldLength; i++) { if (str.charAt(i) == ' ') spaceCount++; } // 重新设置str的长度,长度为原字符串长 + 2 * 空格数 // 原因:每个空格需要2个额外空间 str.setLength(oldLength + 2 * spaceCount); // 保持一个指针指向下次的写入位置 int ptr = str.length() - 1; // 从原字符串末尾开始,分情况将字符移动到新位置 for (int i = oldLength - 1; i >= 0; i--) { if (str.charAt(i) == ' ') { str.setCharAt(ptr--, '0'); str.setCharAt(ptr--, '2'); str.setCharAt(ptr--, '%'); } else { str.setCharAt(ptr--, str.charAt(i)); } } // 返回结果 return str.toString(); } }
public class Solution { public String replaceSpace(StringBuffer str) { //使用双指针的移动策略。 //p1指向当前字符串的尾部。 //p2指向新字符串的尾部。 int p1 = str.length() - 1; for(int i = 0; i <= p1; i++){ if(str.charAt(i) == ' '){ str.append(" "); } } int p2 = str.length() - 1; //p1不断向前移动的过程中,同事判断当前位置上的字符是否是空格。 //若P1指向空格,则需要P2从后向前添加‘0’,‘2’,’%‘三个字符。 //若p2指向非空格,则将当前字符赋给p2指向的位置,从而实现字符的后移操作。 while (p1 >= 0 && p2 > p1){ char c = str.charAt(p1--); if(c == ' '){ str.setCharAt(p2--,'0'); str.setCharAt(p2--,'2'); str.setCharAt(p2--,'%'); }else{ str.setCharAt(p2--,c); } } return str.toString(); } }
return new String(str).replace(" ", "%20");直接调用字符串方法,其实内部实现是使用正则表达式
public class Solution { public String replaceSpace(StringBuffer str) { int len = str.length(); int index = 0; while (len != 0) { if(str.charAt(index) == ' ') { str.insert(index, "%20"); index += 3; str.deleteCharAt(index); } else { index++; } len--; } return str.toString(); } }