题目
思路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';
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)\)
原文创作:linzeliang
原文链接:https://www.cnblogs.com/linzeliang1222/p/15418177.html