題目
請實現一個函數,將一個字符串中的每個空格替換成“%20”。例如,當字符串爲We Are Happy.則經過替換之後的字符串爲We%20Are%20Happy。
解題思路
- 第一反應是
replace
對不對?API大家都會用,但是replace的底層是遍歷查找,然後添加,由於要替換的字符數大於原字符數,因此會導致後面的字符進行復制移動,因此除了最後一個是空格的情況下,有幾個空格就要遍歷幾次,就要複製幾次字符數組,空間和時間複雜度都很高 - 第二種思路自然就是再建一個
StringBuffer
,然後比較字符進行復制,這種做法的時間複雜度和空間複雜度都是n - 第三種思路是不新建一個
StringBuffer
,而是用原來那個,先遍歷一遍統計出總的空格數量,然後算出總長度並將源StringBuffer
的長度修改爲改長度,同時爲了防止覆蓋,採用從後向前替換的方式,採用雙指針移動字符位置。由於提前計算好的總長度,因此在倒歷時達到頭部的空格兩個指針纔會碰到一起,否則舊指針數據不會受到影響
解題代碼
public static String replaceSpace(StringBuffer str) {
if (str == null) return null;
int blankNum = 0;
for (int i=0;i<str.length();i++){
if (str.charAt(i) == ' '){
blankNum++;
}
}
// 舊長度
int oldLength = str.length();
// 指向舊字符串的指針
int oldIndex = oldLength-1;
// 新的總長度
int totalLength = str.length()+blankNum*2;
// 新buffer的倒歷指針
int index = totalLength-1;
str.setLength(totalLength);
while (oldIndex>=0){
char c = str.charAt(oldIndex);
if (c == ' '){
str.setCharAt(index--,'0');
str.setCharAt(index--,'2');
str.setCharAt(index--,'%');
}else {
str.setCharAt(index--,c);
}
oldIndex--;
}
return str.toString();
}