2023.6.13
这道题一开始想得比较简单,就奇怪string不能自动扩容吗,没有用到resize。
自己用的是单指针的解法, 还有双指针的解法,其实思路都一样,双指针稍微好理解一点。下面给出单双指针的解法:
单指针:
class Solution {
public:
string replaceSpace(string s) {
int count = 0;
int i = s.size()-1;
//统计空格的数目
for(int j=0; j<s.size(); j++)
{
if(s[j] == ' ')
{
count++;
}
}
//扩容
s.resize(s.size() + count*2);
while(i >= 0)
{
if(s[i] == ' ') // 为空格的情况
{
s[i + 2*count] = '0';
s[i + 2*count-1] = '2';
s[i + 2*count-2] = '%';
count--;
i--;
}
else //不为空格的情况
{
s[i+2*count] = s[i];
i--;
}
}
return s;
}
};
双指针:
class Solution {
public:
string replaceSpace(string s) {
int count = 0;
int i = s.size()-1;
for(int j=0; j<s.size(); j++)
{
if(s[j] == ' ')
{
count++;
}
}
s.resize(s.size() + count*2);
int k = s.size()-1; //第二个指针 用于维护新数组
while(i >= 0)
{
if(s[i] == ' ')
{
s[k] = '0';
s[k-1] = '2';
s[k-2] = '%';
k = k - 3;
i--;
}
else
{
s[k] = s[i];
i--;
k--;
}
}
return s;
}
};
总体来说双指针比较好理解一点,单指针需要细致一点,用count做了索引。
要注意的一点是:在用“%20” 对空格进行覆盖的时候,2和0需要用单引号‘2’ ‘0’ 引起来,不能直接填2,0,因为s是一个string类型,不是int类型。这里是我出错的地方。
最后再说一下,很多数组填充类问题,都可以先进行一个扩容操作,再从后向前进行填充。这样子做的好处是:
①不用申请额外的空间
②从前向后填充,每次添加元素都需要进行元素后移操作,而从后向前只需要移一次。