LeetCode刷题复盘笔记—剑指 Offer:替换空格

剑指 Offer 05. 替换空格

题目描述:
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:

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

限制:

0 <= s 的长度 <= 10000
题目地址

C++代码

这道题如果开辟额外的空间思路很简单,这里主要讨论一下对于直接在原字符串空间进行替换并且时间复杂度较低的思路方法!
如果按照常规想法,把字符串从头开始扫描,遇到空格后把空格后面所有的字符全部后移两位,则很多后面的字符会被多次后移,导致整体的时间复杂度为O(n^2),所以要想减小时间复杂度,更好的思路是:先遍历一遍字符串,统计空格的数量count,之后字符串后面扩容2 * count 个空间,之后借助双指针方法从字符串后面往前复制和替换字符,两个指针最开始相距 2 * count的位置,直至两个指针相遇,说明所有空格替换完成!

class Solution {
public:
    string replaceSpace(string s) {
        int length = s.size();
        int count = 0;
        for(auto &c : s){
            if(c == ' ') ++count;
        }
        s.resize(length + 2 * count);
        for(int i = length-1, j = s.size()-1;i < j;--i, --j){ //双指针,i指向原来数组的最后位置,j指向扩展长度后数组的最后一位
            if(s[i] == ' '){
                s[j--] = '0';
                s[j--] = '2';
                s[j] = '%';
            }
            else{
                s[j] = s[i];
            }
        }
        return s;
    }
};

时间复杂度:O(n)

总结

这个题目看似很基础,但是很考验基本是否扎实,包括字符串容器的resize()扩容,优化算法的思路!


欢迎大家扫码关注本人公众号:编程复盘与思考随笔

(关注后可以免费获得本人在csdn发布的资源源码)

公众号主要记录编程和刷题时的总结复盘笔记和心得!并且分享读书、工作、生活中的一些思考感悟!
在这里插入图片描述

想要组队一起参加阿里天池,kaggle,百度飞浆,科大讯飞等AI相关的比赛的同学可以扫下面的二维码加微信一起讨论学习!

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Al资料站与复盘笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值