題目很簡單,但是真正做起來,還是遇到一些問題。
那我們接下來看一下:
題目: 替換空格
題目描述:
請實現(xiàn)一個函數(shù),將一個字符串中的空格替換成“%20”。
例如,當字符串為We Are Happy.則經(jīng)過替換之后的字符串為We%20Are%20Happy。
思路分析:
首先我們看到這個問題想到的是so easy,我們于是腦洞大開,這還不簡單,再創(chuàng)建一個字符串,挨個復制進去遇到空格的時候我們將空格替換,這應該是絕大多數(shù)人的思路,這個思路操作起來也不難,但是有些地方需要注意,我們在創(chuàng)建被被復制字符串數(shù)組的時候需要先設定被復制的數(shù)組的大小,復制過程中按位復制等問題,但是還存在的問題是,但是還存在的問題是,假如不讓我們創(chuàng)建復制的字符串的時候,我們需要怎么操作。
進階想法:
我們想到在源數(shù)組上操作,那么我們需要進行的就是從頭開始查找空格,找到之后將數(shù)組中空格之后的數(shù)據(jù)全部向后推移2位,n個字符串的數(shù)組,對于每個空格,我們需要移動后面o(n)個字符,所以對于含有o(n)個空格字符串的字符串的時間復雜度就是O(n^2).
最終想法:
我們在不創(chuàng)建新字符數(shù)組的時候怎么樣實現(xiàn)呢,我們在源字符數(shù)組上面進行操作,我們需要進行下面幾步:
1、分別得到源字符數(shù)組的長度、空格的個數(shù)
2、源字符數(shù)組最終會變成的長度= 源字符數(shù)組的長度+空格的個數(shù)*2(因為一個空格變成了三個字符長度)
3、開始替換從后往前查找,按照字符從后往前寫,我們定義兩個指針,分別指向新和舊兩個字符數(shù)組的最后面,然后碰到空格就改變

image.png
代碼實現(xiàn):
class Solution {
public:
void replaceSpace(char *str,int length) {
int blankNum = 0;
int strLength = 0;
int i = 0;
while(str[i] != '\0'){
strLength ++;
if(str[i] == ' '){
blankNum ++;
}
i++;
}
int desStrLength = strLength + blankNum*2;
if(desStrLength > length)
return;
//從后往前替換
//源字符串最后的位置
int indexStr = strLength;
//目的字符串最后的位置
int indexDes = desStrLength;
while(indexStr >= 0 && indexDes > indexStr){
if(str[indexStr] == ' '){
str[indexDes--] = '0';
str[indexDes--] = '2';
str[indexDes--] = '%';
}else{
str[indexDes--] = str[indexStr];
}
indexStr--;
}
}
};