題目描述
請實現一個函數,將一個字符串中的空格替換成“%20”。例如,當字符串爲We Are Happy.則經過替換之後的字符串爲We%20Are%20Happy。、
解題思路
1.利用API中的方法:
public class Test1 {
public String replaceSpace(StringBuffer str) {
return str.toString().replaceAll(" ", "%20");
}
}
當然這樣是不行的。
2.簡單的遍歷:
public class Test1 {
public String replaceSpace(StringBuffer str) {
String str1 = str.toString();
StringBuffer stb = new StringBuffer();
for(int i=0;i<str.length();i++){
if(str1.charAt(i)==' '){
stb.append("%20");
}else{
stb.append(str1.charAt(i));
}
}
return stb.toString();
}
}
3.針對替換的效率做了優化
從前往後替換,後面的字符要不斷往後移動,要多次移動,所以效率低下
從後往前,先計算需要多少空間,然後從後往前移動,則每個字符只爲移動一次,這樣效率更高一點
public class Test1{
public String replaceSpace(StringBuffer str) {
int sNum = 0;//空格數計數器
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == ' ') {
sNum++;
}
}
int oldIndex = str.length() - 1;//替換前的str下標
int newLength = sNum * 2 + str.length();//計算空格轉換後的長度
int newIndex = newLength - 1;//空格替換爲%20後的下標
str.setLength(newLength);//防止下標越界,將str的長度擴大到轉換後的長度
for (; oldIndex >= 0 && newIndex > oldIndex; oldIndex--) {
if (str.charAt(oldIndex) == ' ') {
str.setCharAt(newIndex--, '0');
str.setCharAt(newIndex--, '2');
str.setCharAt(newIndex--, '%');
} else {
str.setCharAt(newIndex--, str.charAt(oldIndex));
}
}
return str.toString();
}
}
在C++中需要注意每個字符串後面有“\0”,對字符串的長度需要注意下,是和Java不同的。
測試結果:
1.22ms
2.18ms
3.19ms
第一種可能是因爲調用API方法耗費了更多的時間,但是我不知道爲什麼優化的方法會更慢一點,可能是循環的問題?