將長度為1的空格替換為長度為3的「%20」,字元差的產度變長。如果允許我們開闢乙個新的陣列來存放替換空格後的字串,那麼這道題目就非常簡 單。設定兩個指標分別指向新舊字串首元素,遍歷原字串,如果碰到空格就在新字串上填入「%20」,否則就複製元字串上的內容。但是如果面試官要求 在原先的字串上操作,並且保證原字串有足夠長的空間來存放替換後的字串,那麼我們就得另想方法。
如果從前往後替換字串,那麼儲存在空格後面的字串肯定會被覆蓋,那麼我們就考慮從後往前進行替換。
首先遍歷原字串,找出字串的長度以及其中的空格數量,
根據原字串的長度和空格的數量我們可以求出最後新字串的長度。
設定兩個指標point1和point2分別指向原字串和新字串的末尾位置。
如果point1指向內容不為空格,那麼將內容賦值給point2指向的位置,如果point1指向為空格,那麼從point2開始賦值「02%」
直到point1==point2時表明字串中的所有空格都已經替換完畢。
#include#includeusing namespace std;//length為字串總容量
void replacespace(char string, int length)
} int k = i + 2 * blanknumber;
if (k > length)
return;
string[k]='\0';//此行必不可少
int point1 = i - 1, point2 = k-1;
for (; point1 >= 0 && point2 > point1; point1--) else
string[point2--] = string[point1]; }}
int main()
return 0;
}
2.清除空格
這道題目是需要清楚空格,那麼清除空格後所得到的字串要比原先的字串要短,這是我們從頭到尾進行清楚空格的話就不會覆蓋到空格後面的字元,所以我們可以從頭開始清除。
設定兩個指標p1和p2初始狀態都指向字串首字元。
如果p2指向的元素不為空格,那麼將p2指向的內容賦值給p1,然後p1和p2指向下乙個元素;如果p2指向的內容為空格,那麼p2指向下乙個元素。
直到p2指向字串末尾的'\0'時清除空格結束。
#include#includeusing namespace std;void replaceblank(char *s)
}void main()
替換空格(劍指offer面試題4)
分析 從頭到尾掃瞄字串,遇到空格就替換,導致後面的字元都要向後移,意味著總時間複雜度為o n 2 更好的辦法,從字串後面遍歷替換。先遍歷所有的空格,每多乙個空格,字串長度加2個,也就是說最後替換後的字串長度為原長度 2 空格數,設定兩個指標,指向原始字串末尾和新字串末尾,依次向前遍歷,原始字串指標遇...
劍指offer 面試題4 替換空格
題目由來 在網路程式設計中,如果url引數中含有特殊字元,如空格 等,可能導致伺服器端無法獲得正常的引數值。我們需要將這些特殊符號轉換成伺服器可以識別的字元。轉換的規則是在 後面跟上ascii碼的兩位十六進製制的表示。比如空格的ascii碼是32,即十六進製制的0x20,因此空格被替代成 20 思路...
劍指offer 面試題4 替換空格
由於我在實現的時候使用的是c 的string,所以從後往前複製和從前往後複製,時間複雜度是一樣的。如果使用char 陣列實現,則從後往前複製更高效。重點是掌握這種反向思維。class solution 初始化新string string res s.size 2 countblank,a 必須將si...