【Leetcode字符串--双指针】剑指 Offer 05. 替换空格(填充类题目好的解法)

剑指Offer-05

1.问题描述

在这里插入图片描述

2.解决方案

解法一:从前往后遍历

不用多说,思路很清晰,就是从前往后遍历,遇到空格,就整体后移然后填充"%20",但是时间复杂度就是O(n^2),因为每次添加元素都要将添加元素之后的所有元素向后移动,代码这里就不给出了!



解法二:扩容加从后往前遍历双指针

算法优点:

其实很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。
1.把这道题目做到极致,就不要只用额外的辅助空间了!首先扩充数组到每个空格替换成"%20"之后的大小。
2.然后从后向前替换空格,也就是双指针法,i指向新长度的末尾,j指向旧长度的末尾。
3.不用申请新数组。
4.从后向前填充元素,避免了从前先后填充元素要来的,每次添加元素都要将添加元素之后的所有元素向后移动,时间复杂度将为o(n)

在这里插入图片描述

在这里插入图片描述

代码实现:

先统计再扩充,扩充用到了resize(),然后从后往前填充!

class Solution {
public:
    string replaceSpace(string s) {
        //统计空格字符的数量
        int oldSize=s.size();
        int count=0;
        for (auto item: s) {
            if(item==' ') count++;
        }

        //扩充
        s.resize(s.size()+count*2);
        int newSize=s.size();

        //从后先前将空格替换为"%20"
        //...j(oldSize-1)...i(newSize-1)
        //j<i
        for(int i=newSize-1,j=oldSize-1;j<i;){
            if(s[j]!=' '){ //不是空格就赋值
                s[i]=s[j];
                i--;
                j--;
            }else{         //是空格就填充
                s[i]='0';
                s[i-1]='2';
                s[i-2]='%';
                i-=3;
                j--;
            }
        }
        return s;
    }
};

解法三:Java StringBuilder 简洁解决方法

class Solution {
    public String replaceSpace(String s) {
        StringBuilder sb = new StringBuilder();
        for(char c:s.toCharArray()){
            if(c==' ') sb.append("%20");
            else sb.append(c);
        }
        return sb.toString();
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值