題目描述 請實現一個函數,將一個字符串中的每個空格替換成“%20”。例如,當字符串爲We Are
Happy.則經過替換之後的字符串爲We%20Are%20Happy。
分析:
將長度爲1的空格替換爲長度爲3的“%20”,字符差的產度變長。 如果允許我們開闢一個新的數組來存放替換空格後的字符串, 那麼這道題目就非常簡
單。設置兩個指針分別指向新舊字符串首元素, 遍歷原字符串,如果碰到空格就在新字符串上填入“%20”,
否則就複製元字符串上的內容。但是如果面試官要求 在原先的字符串上操作,並且保證原字符串有足夠長的空間來存放替換後的字符串,
那麼我們就得另想方法。 如果從前往後替換字符串,那麼保存在空格後面的字符串肯定會被覆蓋, 那麼我們就考慮從後往前進行替換。
首先遍歷原字符串,找出字符串的長度以及其中的空格數量, 根據原字符串的長度和空格的數量我們可以求出最後新字符串的長度。
設置兩個指針point1和point2分別指向原字符串和新字符串的末尾位置。
如果point1指向內容不爲空格,那麼將內容賦值給point2指向的位置, 如果point1指向爲空格,那麼從point2開始賦值“02%”
直到point1==point2時表明字符串中的所有空格都已經替換完畢。
代碼 c++:
class Solution {
public:
void replaceSpace(char *str,int length) {
if (str == NULL || length <0)
return;
int num = 0; //空格數目
for (int i = 0; i < length; i++) {
if (str[i] == ' ')
num++;
}
char* p1 = &str[length - 1];//原字符串指針
int total = length - 1 + num * 2; //新字符串個數
char* p2 = &str[total];//新字符串指針
for (int i = length - 1; i >= 0; i--) {
if (str[i] == ' ') {
*p2-- = '0';
*p2-- = '2';
*p2-- = '%';
p1--;
}
else {
*p2-- = *p1--;
}
}
}
};