力扣-替换空格

发布时间 2023-09-24 20:10:57作者: 摆烂卧底

1.问题

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

示例 1: 输入:s = "We are happy."
输出:"We%20are%20happy."

2.说明

输入说明:

输入一个字符串s

输出说明:

输出替换空格后的字符串

3.范例

输入范例:

we are h

输出范例:

we%20are%20h

4.思路

使用双指针方法,对字符串数组进行扩充空间,而扩充多少则需要对字符串计算其空格个数,再根据将空格替换成%20这三个字符,因此需要在原空间上扩充空格数的2倍;

其次下标代替指针,其中 j =原字符串最后一个字符,i = 扩充空间后的字符串最后一个位置,开始重后往前遍历,s[j]!=' '时,将下标 j 的字符放入 下标 i 处,当=‘ ’时,则在下标i往前三个位置分别放入%20,并将i往前移动3格

5.代码

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
class Solution
{
public:
    //替换空格
    string replaceSpace(string s)
    {
        int oldsize=s.size();
        int count=0;
        //1.计算字符串中有多少个空格
        for(int i=0;i<s.size();i++)
        {
            if(s[i]==' ')
                count++;
        }
        //2.扩充数组大小
        s.resize(s.size()+count*2);//weishenme *2呢?原来就有空格一个空间,此处可以放%,增加2个空间,一个空间存2,一个空间存0
        //3.定义双下标,从后往前遍历,j为原s最后一个字符位置,i为扩充后最后一个字符的位置
        int newsize=s.size();
        for(int i=newsize-1,j=oldsize-1;j<i;j--,i--)
        {
            if(s[j]!=' ')
            {
                s[i]=s[j];
            }
            else
            {
                s[i]='0';
                s[i-1]='2';
                s[i-2]='%';
                i -=2;
            }
        }
        return s;
    }
};
int main()
{
    string s;
    getline(cin,s);
    string res=Solution().replaceSpace(s);
    cout<<res<<endl;
    return 0;
}