題目描述:請實現(xiàn)一個函數(shù)钞支,將字符串的每個空格替換為"%20"韵洋。例如輸入"We are happy",則輸出"We%20are%20happy."山上。
思路:問題1:替換字符串,是在原來的字符串上做替換宽气,還是新開辟一個字符串做替換!問題2:在當前字符串替換潜沦,怎么替換才更有效率(不考慮java里現(xiàn)有的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();
// 輸入的字符串包含空格:最后面,最前面刻蟹,中間逗旁,連續(xù)空格
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.");
//特殊輸入測試:字符串只有連續(xù)空格、只有一個空格舆瘪、字符串是一個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));
}
}