力扣leetcode剑指 Offer 05. 替换空格C++
剑指 Offer 05. 替换空格
思路1
拿到这道题目的第一想法就是构建一个新的字符串然后遇到空格就+%20这样的话肯定可以通过,但是会有额外的空间开销
代码如下
class Solution {
public:
string replaceSpace(string s) {
string str = "";
for(char c : s)
{
if(c != ' ')
{
str += c;
}
else
{
str += "%20";
}
}
return str;
}
};
时间复杂度 O(n)
空间复杂度 O(n)
思路2
想要降低空间复杂度,就需要考虑原地修改数组,我们考虑先对数组扩充到合适大小,然后使用双指针从后向前进行替换
举例来说
可以看到,我们在遇到非空格字符时就直接进行拷贝,然后指针向前移动,当遇到空格字符时我们就在尾部添上%20然后指针继续前移
代码如下
class Solution {
public:
string replaceSpace(string s) {
//利用双指针从后向前进行填充
//先将数组扩大到需要大小 然后进行填充
int spaceNum = 0;
for(char c : s)
{
if(c == ' ')
{
spaceNum++;
}
}
int n = s.size();
s.resize(n + spaceNum * 2);
for(int back = s.size()-1, front = n-1; front >= 0;front--, back--)
{
if(s[front] != ' ')
{
s[back] = s[front];
}
else
{
s[back--] = '0';
s[back--] = '2';
s[back] = '%';
}
}
return s;
}
};