Microsoft - URLify A Given String
#easy
思路
如果想把這道題目做到極致,就不要只用額外的輔助空間了!
首先擴充數組到每個空格替換成"%20"之後的大小。
然後從後向前替換空格,也就是雙指針法,過程如下:
i指向新長度的末尾,j指向舊長度的末尾。
有同學問了,為什麼要從後向前填充,從前向後填充不行麼?
從前向後填充就是O(n^2)的算法了,因為每次添加元素都要將添加元素之後的所有元素向後移動。
**其實很多數組填充類的問題,都可以先預先給數組擴容帶填充後的大小,然後在從後向前進行操作。**這麼做有兩個好處:
- 不用申請新數組。
- 從後向前填充元素,避免了從前向後填充元素時,每次添加元素都要將添加元素之後的所有元素向後移動的問題。
時間複雜度,空間複雜度均超過100%的用戶。
Solution
class Solution {
public:
string replaceSpace(string s) {
int count = 0;
int sOldSize = s.size();
for ( int i = 0; i < s.size(); i++ ) {
if ( s[i] == ' ' ) count++;
}
s.resize(s.size() + count * 2 ); // key: 先擴充好新字串的長度
int sNewSize = s.size();
for ( int i = sOldSize - 1, j = sNewSize - 1; i >= 0; i--, j-- ) {
if ( s[i] != ' ' ) s[j] = s[i];
else {
s[j] = '0';
s[j-1] = '2';
s[j-2] = '%';
j -= 2;
}
}
return s;
}
};