题目:替换空格
题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
解题思路:
解题思路:String中的内容是不能改变的。一旦试图改变String中的内容,就会产生一个新的实例。如果试图改变String的内容,改变之后的值只能通过返回值得到。用String做连续多次修改,每一次都会产生一个临时的对象,这样开销太大会影响效率。stringBuffer能容纳修改后的结果,因此如果要连续多次修改字符串内容,用String Buffer是更好的选择。
(1)如果是字符数组,可以定义一个 str的长度+空格个数*2的数组,从后往前移动指针
(2) 用StringBuffer
这道题目在牛客网给出的实现函数是public String replaceSpace(StringBuffer str) {},个人感觉直接在StringBuffer上面进行修改即可,不会产生新的实例。因为给的又不是String,也不是char [] 。但是不知道为什么磁体评论区的大佬还是给出了原书的代码。不过还是具有一定的参考性,这里也会给出评论区某一位大佬的答案做参考。
第一种思路:直接用String Buffer中的replace方法
public class Solution {
public String replaceSpace(StringBuffer str) {
for(int i=0;i<str.length();i++) {
if(str.charAt(i)==' ') {
str.replace(i, i+1, "%20");
}
}
return str.toString();
}
}
第二种思路:来源于牛客网此题的评论区
/*
问题1:替换字符串,是在原来的字符串上做替换,还是新开辟一个字符串做替换!
问题2:在当前字符串替换,怎么替换才更有效率(不考虑java里现有的replace方法)。
从前往后替换,后面的字符要不断往后移动,要多次移动,所以效率低下
从后往前,先计算需要多少空间,然后从后往前移动,则每个字符只为移动一次,这样效率更高一点。
*/
public class Solution {
public String replaceSpace(StringBuffer str) {
int spacenum = 0;//spacenum为计算空格数
for(int i=0;i<str.length();i++){
if(str.charAt(i)==' ')
spacenum++;
}
int indexold = str.length()-1; //indexold为为替换前的str下标
int newlength = str.length() + spacenum*2;//计算空格转换成%20之后的str长度
int indexnew = newlength-1;//indexold为为把空格替换为%20后的str下标
str.setLength(newlength);//使str的长度扩大到转换成%20之后的长度,防止下标越界
for(;indexold>=0 && indexold<newlength;--indexold){
if(str.charAt(indexold) == ' '){ //
str.setCharAt(indexnew--, '0');
str.setCharAt(indexnew--, '2');
str.setCharAt(indexnew--, '%');
}else{
str.setCharAt(indexnew--, str.charAt(indexold));
}
}
return str.toString();
}
}
ps:此代码我未做证明与验证,但是思路和原书是相同的