题目描述:请实现一个函数,将字符串的每个空格替换为"%20"。例如输入"We are happy",则输出"We%20are%20happy."。
思路:问题1:替换字符串,是在原来的字符串上做替换,还是新开辟一个字符串做替换!问题2:在当前字符串替换,怎么替换才更有效率(不考虑java里现有的replace方法)。 从前往后替换,后面的字符要不断往后移动,要多次移动,所以效率低下。 从后往前,先计算需要多少空间,然后从后往前移动,则每个字符只为移动一次,这样效率更高一点。
public class ReplaceBank {
public String replace(StringBuffer input) {
if(input == null || input.length() == 0){
return null;
}
int numberOfBlank = 0;
for(int i=0; i<input.length(); i++){
if(input.charAt(i) == ' ') {
numberOfBlank++;
}
}
int newLength = input.length() + 2 * numberOfBlank;
int indexOfOriginal = input.length() - 1;
int indexOfNew = newLength - 1;
input.setLength(newLength);
while(indexOfOriginal >=0 && indexOfNew > indexOfOriginal) {
if(input.charAt(indexOfOriginal) == ' '){
input.setCharAt(indexOfNew--, '0');
input.setCharAt(indexOfNew--, '2');
input.setCharAt(indexOfNew--, '%');
}
else {
input.setCharAt(indexOfNew--, input.charAt(indexOfOriginal));
}
indexOfOriginal--;
}
return input.toString();
}
public static void main(String[] args) {
ReplaceBank test = new ReplaceBank();
// 输入的字符串包含空格:最后面,最前面,中间,连续空格
StringBuffer str1 = new StringBuffer("We are happy.");
StringBuffer str2 = new StringBuffer(" Wearehappy.");
StringBuffer str3 = new StringBuffer("Wearehappy. ");
StringBuffer str4 = new StringBuffer("We are happy .");
//输入的字符串没有空格
StringBuffer str5 = new StringBuffer("Wearehappy.");
//特殊输入测试:字符串只有连续空格、只有一个空格、字符串是一个null指针、字符串是一个空字符串;
StringBuffer str6 = new StringBuffer(" ");
StringBuffer str7 = new StringBuffer(" ");
StringBuffer str8 = null;
StringBuffer str9 = new StringBuffer("");
System.out.println(test.replace(str1));
System.out.println(test.replace(str2));
System.out.println(test.replace(str3));
System.out.println(test.replace(str4));
System.out.println(test.replace(str5));
System.out.println(test.replace(str6));
System.out.println(test.replace(str7));
System.out.println(test.replace(str8));
System.out.println(test.replace(str9));
}
}