剑指 Offer 05:替换空格题解及注意事项
题目
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。要求:空间复杂度 O(1)
示例 1:
输入:s = "We are happy."
输出:"We%20are%20happy."
限制:
0 <= s 的长度 <= 10000
思路
题目要求空间复杂度为O(1),所以不能通过新建字符串的形式添加,我们需要在原字符串上实现原地修改:
- 因为要将每个" "都更改为“%20”,每替换一次字符串长度增加2,设字符串长度为len、总共有cnt个空格,那么修改后的字符串长度newLen = len+2*cnt
- 设立两个指针,分别指向len-1,newLen-1,即旧字符串和新字符串的最后一个位置,倒序遍历字符串:
- 当s[i] != ' ' 时,令s[j]=[i]
- 当s[i] == ' '时:
- s[j] = '0'
- s[j-1] = '2'
- s[j-2] = '%'
- j = j - 2 ; //额外赋了两个值,所以向前移动两个单元
直到 i == j(代表i之前已无空格);
C++代码
class Solution{ public: string replaceSpace(string s) { int len = s.size(); int cnt = 0; for (int i = 0; i < len; ++i){ if (s[i] == ' ')cnt++; } s.resize(len + 2 * cnt); for (int i = len - 1, j = s.size() - 1; i < j && 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; } };

浙公网安备 33010602011771号