力扣 - 剑指 Offer 05. 替换空格
题目
思路1
- 使用辅助数组,边遍历变添加
- 遇到空格,将空格替换为
%20
代码
class Solution {
public String replaceSpace(String s) {
int length = s.length();
char[] temp = new char[length*3];
int p = 0;
for (char c : s.toCharArray()) {
if (c == ' ') {
temp[p++] = '%';
temp[p++] = '2';
temp[p++] = '0';
} else {
temp[p++] = c;
}
}
return new String(temp, 0, p);
}
}
复杂度分析
- 时间复杂度:\(O(N)\)
- 空间复杂度:\(O(N)\)
思路2
- 因为Java和Python的字符串都是不可变的,所以只能创建辅助数组,但是C/C++的字符串是可变的,因此我们可以原地修改
- 先扩展字符串的长度:首先遍历一遍字符串获取总空格的个数,所以新字符串的长度为
原字符串长度 + 空格数*2 - 我们扩展的空间刚刚好够我们原地遍历。首先我们用两个指针p1、p2,p1指向原来字符串的末尾和p2指向扩展后的字符串的末尾,从后往前遍历,遇到非空格的直接复制过去,两个指针同时前移一步;遇到空格p1前移一步,p2前移3步,依次填入
0、2、%,直到到达字符串的首部完成替换!
代码
class Solution {
public:
string replaceSpace(string s) {
int count = 0, len = s.size();
// 统计空格数量
for (char c : s) {
if (c == ' ') count++;
}
// 修改 s 长度
s.resize(len + 2 * count);
// 倒序遍历修改
for(int i = len - 1, j = s.size() - 1; i < j; i--, j--) {
if (s[i] != ' ')
s[j] = s[i];
else {
s[j - 2] = '%';
s[j - 1] = '2';
s[j] = '0';
j -= 2;
}
}
return s;
}
};
复杂度分析
- 时间复杂度:\(O(N)\)
- 空间复杂度:\(O(1)\)
我走得很慢,但我从不后退!

浙公网安备 33010602011771号