剑指offer | 05.替换空格

题目内容

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

示例 1:

输入:s = “We are happy.”
输出:“We%20are%20happy.”


思路:

  • 前导知识:在网络编程中,服务器可能因为特殊字符而无法获得正确的参数,所以要将特殊符号换成ASCII。转换的规则是在%后面加上对应的ASCII两位十六位进制表示。
    • 比如,空格的ASCII码是32,即十六进制的0x20,因此空格被替换成%20
  • 题目分析:将空格替换成% 2 0三个字符的话,字符串会变长,所以需要向面试官问清楚是在原字符串上修改还是可以新开一个字符串。
  • 方法1:每次替换时,都要将后面所有数往后移2位以防止覆盖,时间复杂度为O( n 2 n^2 n2),不够快,那还有更快的方法吗?
  • 方法2:从前往后很麻烦的话,可以考虑从后往前替换。
    • 我们可以先将字符串从头到尾遍历一遍,计算出总共需要替换的空格数目。
    • 然后因为每替换一个空格,总长度就要增加2,所以替换以后的字符串长度就等于原数组+空格数*2.
    • 我们从字符串的后面开始复制和替换,需要用到两个指针p1,p2。p1指向原字符串的末尾,p2指向替换之后的字符串末尾。
    • 移动p1,p2逐个复制字符,直到碰到空格,碰到空格后,p1向前移动1格,p2在前面插入%20之后,移动3格。
    • 重复上述步骤直到p1p2指向同一位置表示复制结束。
      在这里插入图片描述
class Solution {
public:
    string replaceSpace(string s) {
        int slen=s.size();//原字符串长度
        int blank=0;//记录空格个数
        //遍历 统计所有空格个数
        int i=0;
        while(s[i]!='\0'){
            if(s[i]==' ')blank++;
            ++i;
        }

        int newlen=slen+2*blank;//替换完全之后新字符串的长度
        s.resize(newlen);//修改字符串长度
        int p1=slen-1;//p1指向原数组末尾,一定记得字符串多出来的‘\0’,所以p1p2要-1
        int p2=newlen-1;//p2指向新数组末尾
        
        while(p1>=0 &&p2>p1){
            if(s[p1]==' '){
                s[p2--]='0';
                s[p2--]='2';
                s[p2--]='%';
            }else{
                s[p2--]=s[p1];
            }
            --p1;
        }
        return s;
    }
};

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值