力扣 剑指 Offer 05 替换空格


题目链接

https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/

1、题目要求

简单来说将给定的一个字符串,将字符串里面的所有空格替换为%20;

示例 1:
输入:s = "We are happy."
输出:"We%20are%20happy."

2、思路分析 - 基于双指针法的单个字符替换

  • 1、首先进行字符串的扩容,扩容的字符个数由输入字符串中包含的空格所决定;使用 StringBuilder 在单线程下面提升字符串的拼接速度;

  • 2、确定扩容的容量之后,与传递进来的字符串 s 进行合并;

  • 3、确定两个指针的起始位置
    确定第一个指针:left = s.length() - 1;
    确定第二个指针:right = (扩容后的s).length() - 1;

  • 4、进行循环处理:
    当 left 指向的 chars 数组中的元素不是空格的时候,进行元素的复制;
    当 left 指向的 chars 数组中的元素是空格的时候,进行空格的替换

3、执行代码 - Java

class Solution {
    public String replaceSpace(String s) {
        // 判断传进来的字符串非空以及长度是不是 0 
        if (s == null || s.length() == 0) {
            return s;
        }

        // 创建出来一个 str 用来得到需要扩展的数组长度
        StringBuilder str = new StringBuilder(); // 用于字符串的拼接
        for (int i = 0; i < s.length(); i++) {
            char temp = s.charAt(i);

            if (temp == ' ') {
                str.append("  "); // 扩展两个空格
            }
        }

        // 判断出原来的字符串没有空格,不需要扩展的时候直接返回 s
        if (str.length() == 0) {
            return s;
        }

        // 得到扩展好的字符串,使用双指针进行元素的代替
        int left = s.length() - 1;
        s += str.toString();

        // 下面使用双指针对于 s 进行操作
        int right = s.length() - 1;

        char[] chars = s.toCharArray();
        while (left >= 0) {
            if (chars[left] != ' ') { // s 转换成为 字符数组才可以使用数组索引
                chars[right] = chars[left];
            } else {
                chars[right--] = '0';
                chars[right--] = '2';
                chars[right] = '%';
            }

            left--;
            right--;
            
        }
        
        return new String(chars);
    }
}

4、问题反思

4.1、chars[right–] = ‘0’; 的理解

这个等同于 chars[right] = ‘0’; right–;

4.2、return new String(chars);

所有的替换操作是基于这个 char 数组展开的,所以在返回的时候,需要将其转换成为 String 数组进行返回即可;

5、小结

根据双指针的形式,进行了输入字符串中包含的空格代替。解决数组中的某个元素或者某几个元素代替的时候,均可以使用先扩容然后替换的解题思路;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值