这道题我用了三种解法,都可以在牛客网上通过。
第一种方法比较直观,但是比较麻烦;第二种方法是在第一种方法的基础上改的,也比较直观;第三种方法是我参考网上写的,跟前面两种比较不同
public class Solution {
public String replaceSpace(StringBuffer str) {
//第一种,这种解法比较直观但也比较麻烦,思路是从前往后看,遇到空格就保存空格后面的字符,然后替换掉空格,最后将连接空格后面的字符
/*String st = str.toString();//将StringBuffer转为String
char[] tct = st.toCharArray();//将String转为char数组,并存在char数组中
char[] ct = new char[100];
System.arraycopy(tct,0,ct,0,tct.length);//将tct数组的值赋给ct数组
int n = tct.length;//获取tct数组的长度,也就是输入的字符串中有几个字符
char[] tst = new char[100];//新建一个中间数组,存放空格后面的字符
for(int i = 0;i < n;){
int nn = 0;//nn记录空格后有几个字符
if(ct[i] == ' '){//当检测到空格时
for(int j = i + 1,ii = 0;j < n;j++,ii++){
//将空格后面的字符存在tst字符数组中
tst[ii] = ct[j];
nn++;
}
//赋值
ct[i] = '%';
ct[i + 1] = '2';
ct[i + 2] = '0';
//将tst字符数组中的字符赋给ct字符数组
for(int j = i + 3,ii = 0;ii <= nn;j++,ii++){
ct[j] = tst[ii];
}
n += 2;//ct字符数组长度加2
i += 2;//由于赋值后的20明显不是空格,所以就跳过他们
continue;
}
i++;//继续下一个字符
}
StringBuffer stringBuffer = new StringBuffer(String.valueOf(ct));//将String类型转为StringBuffer类型
stringBuffer.setLength(n);//设置StringBuffer类型的stringBuffer长度为加入新字符后的长度n
return stringBuffer.toString();//将stringBuffer转为String类型后返回*/
//第二种,跟第一种方法相似,新建一个字符数组,边判断边赋值,最后返回这个新建的数组
/*String st = str.toString();//将StringBuffer转为String
char[] ct = st.toCharArray();//将String转为char数组,并存在char数组中
char[] tct = new char[100];//新数组
int n = ct.length;//原字符串的长度
int index = 0;
for(int i = 0;i < n;){
if(ct[i] == ' '){
//赋值
tct[index] = '%';
tct[index + 1] = '2';
tct[index + 2] = '0';
index += 3;//新数组往后三个
i++;
}
else{
//不是空格就把原来的值赋给新数组
tct[index] = ct[i];
i++;
index++;
}
}
StringBuffer stringBuffer = new StringBuffer(String.valueOf(tct));//将String类型转为StringBuffer类型
stringBuffer.setLength(index);//设置StringBuffer类型的stringBuffer长度为加入新字符后的长度n
return stringBuffer.toString();//将stringBuffer转为String类型后返回*/
/*第三种,跟前两种不同,这种解法是将字符串从后向前找的,这种解法是我参考网上其他人写的,
而且这种解法的好处是它先计算了新建数组的长度,然后再进行赋值。而前面两种解法把字符的个数写死了,
只能是转换后有100个字符,如果超过100个,则报错*/
int n = str.length();//字符串的长度
int ii = 0;//空格的个数ii
for(int i = 0;i < n;i++){
//检测空格
if(str.charAt(i)==' '){
ii++;
}
}
int nn = 2 * ii + n;//根据空格的个数,得到新数组的长度
int index = nn -1;
char[] ct = new char[nn];//新建数组
while(n > 0){
if(str.charAt(n - 1) != ' '){
//如果不是空格
ct[index--] = str.charAt(n-1);
}
else{
//如果是空格
ct[index--] = '0';
ct[index--] = '2';
ct[index--] = '%';
}
//取下一个字符
n--;
}
return String.valueOf(ct);//将字符数组转为String类型后返回
}
}