剑指Offer(二):替换空格

在这里插入图片描述

一.前言

本系列文章为《剑指offer》算法讲解。
共享资源:资源链接

二.题目描述

请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

1.题目分析
(1)首先我们看到这个题目时,我们应该想到,我们如何对一个字符串里面的字符进行操作,如果直接对字符串进行操作的话,那么我们能做的只是对字符串进行拼接,转换等一系列整体的操作,无法对里面单独的字符进行操作。
(2)所以我们只能把字符串转换成我们能操作的数据格式,我们常常做的就是字符串转换成字符数组,然后我们就将对字符串的操作转换为数组的操作。
(3)学习算法,我感觉研究到底的话,其实就是对数组和字符串的操作。这篇就是对字符串和字符串数组的描述,我感觉写的很好,分析给大家。
字符串和字符串数组

2.举例
对题目的流程,我自己画图不太好看,大家可以看一下这个算法流程描述博客,我感觉画的很清晰,自己可以看一下,跟着把替换空格的流程走一遍,就会理解这个算法的思路。

3.编程实现

主要实现:

public static String replaceStr(String str) {
    if(StringUtils.isEmpty(str)) {
        return null;
    }
    char[] arrayStr = str.toCharArray();
    int spaceNum = 0;
    for (char array : arrayStr) {
        if(array == ' ') {
            spaceNum++;
        }
    }
    // 由于使用%20替换一个空格,%20占三个字符,空格占一个字符,所以比原先多占两个字符的位置
    int newLength = arrayStr.length + spaceNum*2;
    char[] newStr = new char[newLength];
    int arrayStrIndex = arrayStr.length - 1;
    int newStrIndex = newStr.length - 1;
    for(; arrayStrIndex >= 0; arrayStrIndex--) {
        if(arrayStr[arrayStrIndex] != ' ') {
            newStr[newStrIndex--] = arrayStr[arrayStrIndex];
            continue;
        }
        newStr[newStrIndex--] = '0';
        newStr[newStrIndex--] = '2';
        newStr[newStrIndex--] = '%';
    }
    return new String(newStr);
}

测试:

public static void main(String[] args) {
    String str = "程序员 曹 先  生";
    System.out.println("替换后的字符为:"+replaceStr(str));
}

结果:
在这里插入图片描述

4.代码说明与开发过程中遇到的问题
(1)首先大家要对字符,字符串,字符数组搞明白,才能对这道题目下手。我刚开始写的时候,感觉将字符串转换为字符数组,然后遍历数组就可以搞定了,但是我忽略了一个重要的点就是“空格只占一个字符,而%20占3个字符”,导致我后面写错了。
(2)我想几乎大多数人估计刚开始都是采用找到一个空格就替换的方法,但是查找空格的数量和替换空格最好不要并行操作,因为在不知道空格的数量下,我们是不知道字符数组的长度的。如果我们遍历数组的时候,找到空格就会替换的话,就会造成后面数据的混乱,操作很复杂,很乱。

5.总结
对字符串,字符串数组,字符的操作要熟练掌握,不然我们即使我们知道一个算法怎么解,但是我们也是无法开始做的,不能让最简单的东西挡住我们。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值