字符串——3.力扣题目:剑指 Offer 05. 替换空格

题目链接

解析:(扩容+从后往前的双指针)

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

大体思路:直接创建一个StringBuilder,遍历并且遇到空格添加“%20”是可以做的。但是如果想直接使用一个数组的存储空间来完成怎么办?

因为每一个空格需要变为“%20",一个空格需要三个存储单位,空格自己有一个存储单位,所以需要在原来长度的基础上,每遇到一个空格就加上两个存储空间。

所以定义一个StringBuilder,遇到一个空格,就给它增加两个存储单位。

在讲StringBuiler使用toString()追加到原来的s后面,再使用toCharArray转为字符数组

left指向数组在原来字符串的末尾的位置,right指向数组追加后的字符串的末尾。

双指针的迭代规则如图所示:
请添加图片描述

right不断复制left的值,遇到空格,放入’0’, ‘2’, ‘%’.

所以为什么要从后向前插入,因为追加的空间在后面。

注意点:(数组填充类问题)

数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。

代码:
class Solution {
    public String replaceSpace(String s) {
        if (s == null ||s.length() == 0) return "";
        StringBuilder str = new StringBuilder();
        for (char i : s.toCharArray()) {
            if (i == ' ') str.append("  ");
        }
        if (str.length() == 0) return s;
        int left = s.length() - 1;
        s += str.toString();
        int right = s.length() - 1;
        char[] arr = s.toCharArray();
        while (left >= 0) {
            if (arr[left] == ' ') {
                arr[right] = '0';
                arr[right - 1] = '2';
                arr[right - 2] = '%';
                right -= 3;
                left--;
            } else {
                arr[right] = arr[left];
                right--;
                left--;
            }
        }
        return new String(arr);
    }
}

索引:图片来自于代码随想录

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值