爱吃柚子
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();
}
}