【劍指offor】2、替換空格
阿新 • • 發佈:2018-11-07
題目連結:
替換空格
題目描述
請實現一個函式,將一個字串中的每個空格替換成“%20”。例如,當字串為We Are Happy.則經過替換之後的字串為We%20Are%20Happy。
注意:C++解法中,給定的字串結尾後面還有一定的空間,不然我們還得重新給它分配足夠的記憶體空間才能將空格換成%20。在寫題過程中,我們需要判斷替換後的字串是否會超過給定的記憶體空間長度,超過了就直接返回。Java解法需要自己重新分配記憶體空間。
解題思路
O(n2)的思路就不寫了,直接就是從前開始遍歷,遇到空格就將後面所有剩餘的字串往後移動兩個位置,然後前面的空格後面就多了兩個空位置,寫上%20即可。
O(n)的解法:
這種題型,要很容易想到從後往前掃描字串。我們可以這樣:先計算出該字串有幾個空格,然後算出替換後的字串一共需要多少空間的長度。我們從字串的後面開始準備複製和替換。可以看以下圖示過程:
其中,p2是指向替換後字串的結尾處應該在哪裡,p1是指向替換前,字串的結尾處。
我們從字串的後面開始複製和替換,當p1指向的是字元,則將字元複製給p2位置。同時,p1和p2同時向前移動。當p1遇到空格,則p2處賦值字元’0’;p2再向前移動一格,p2處賦值字元’2’;p2再向前移動一格,p2處賦值字元’%’。然後p1和p2再同時向前移動一格。以此類推最終將所有空格替換完成。
java程式碼:
public class Solution {
public String replaceSpace(StringBuffer str) {
int knum=0;
/*計算空格的數量與字串的長度*/
for(int i=0;i<str.length();i++){
if(str.charAt(i)==' ')
knum++;
}
/* 替換空格後的字串的長度 */
int newlen=str.length()+2*knum;
int p1=str.length()-1,p2=newlen-1;
str.setLength(newlen);
while(p1>=0 && p2>p1){s
if(str.charAt(p1)==' '){
str.setCharAt(p2--, '0');
str.setCharAt(p2--, '2');
str.setCharAt(p2--, '%');
--p1;
}else{
str.setCharAt(p2--, str.charAt(p1--));
}
}
return str.toString();
}
}
C++程式碼:
class Solution {
public:
void replaceSpace(char *str,int length) {
int strlen=0,knum=0,i=0;
/*計算空格的數量與字串的長度*/
while(str[i]!='\0'){
strlen++;
if(str[i]==' ') ++knum;
i++;
}
/* 替換空格後的字串的長度 */
int newlen=strlen+2*knum;
/* 如果替換後的長度超過了給出的固定長度則返回 */
if(newlen>length)return;
int p1=strlen,p2=newlen;
while(p1>=0 && p2>p1){
if(str[p1]==' '){
str[p2--]='0';
str[p2--]='2';
str[p2--]='%';
--p1;
}
else{
str[p2--]=str[p1--];
}
}
}
};
總結
遇到這種字串替換的問題,如果時間複雜度達到O(n2),則考慮從後往前替換。同時注意要將複製的過程用圖示畫出來,才不會導致程式設計出錯。
探討學習加:
qq:1126137994
微信:liu1126137994