【剑指offer-C++】JZ5 - 替换空格

【剑指offer】JZ5 - 替换空格

题目描述

描述:请实现一个函数,将一个字符串s中的每个空格替换成“%20”。例如,当字符串为We Are Happy,则经过替换之后的字符串为We%20Are%20Happy。

数据范围:0≤len(s)≤1000 。保证字符串中的字符为大写英文字母、小写英文字母和空格中的一种。

输入:"We Are Happy"
返回值:"We%20Are%20Happy"
输入:" "
返回值:"%20"

解题思路

替换空格:最直观的想法是,创建一个新的字符串变量result,然后从头开始遍历字符串s的每一个字符,如果当前字符不为空格,则将当前字符加入到result中,反之将"%20"加入到result中。

string replaceSpace(string s) {
        string result;
        for(int i=0;i<s.size();i++)
        {
            if(s[i]!=' ')
            result+=s[i];
            else
            result+="%20";
        }
        return result;
    }

idea:其实也可以将字符串变量result替换为vector<char>变量result,最后函数返回值使用构造函数和迭代器完成转换,即return string(result.begin(),result.end())。

string replaceSpace(string s) {
        vector<char> result;
        for(int i=0;i<s.size();i++)
        {
            if(s[i]!=' ')
            result.push_back(s[i]);
            else
            {
                result.push_back('%');
                result.push_back('2');
                result.push_back('0');
            }
        }
        return string(result.begin(),result.end());
    }

优化:上述方法均是使用了额外的空间,那么有没有不使用额外的空间的方法呢?当然有!我们不用创建新的变量,而是直接在原来的字符串s上进行修改。首先统计字符串s中的空格数量count,然后对字符串s进行扩容,接着再使用双指针方法从后向前遍历字符串,i表示原来字符串的元素位置,j表示扩容字符串的元素位置,当s[i]不为空时,就将s[i]赋值给s[j],反之从j位置开始依次倒序添加’0’、‘2’、‘%’,直至i=j结束,故双指针的循环条件是i<j。

string replaceSpace(string s) {
        int count=0; //用于记录空格个数
        int olds=s.size(); //用于记录原始字符串长度
        for(int i=0;i<olds;i++) //统计s中空格个数
            if(s[i]==' ') count++;
        int news=olds+count*2; //扩容后的字符串长度
        s.resize(news); //对s进行扩容
        for(int i=olds-1,j=news-1;i<j;i--,j--) //双指针更新s
        {
            if(s[i]!=' ')
                s[j]=s[i];
            else
            {
                s[j]='0';
                s[j-1]='2';
                s[j-2]='%';
                j-=2; //注意更改j
            }
        }
        return s;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值