剑指Offer---替换空格

题目如下
在这里插入图片描述
请实现一个函数,把字符串 s 中的每个空格替换成"%20"


1.题目解读

把字符串 s 中的每个空格替换成"%20,学过Java基础的同学当然会java自带的替换字符串方法replaceAll将空格替换成"%20",但是并不是题目要求的解题思路,我们可以通过StringBuilder方法和数组解决该题。


2.题目解法

数组

求速度牺牲空间方法
我们使用静态数组方法,首先我们要创建一个数组,来储存原字符串数组和要替换的数组元素。我们在原数组和自己创建的数组设定一个指针,使用一个判断条件,如果不上是空格就将原字符串数组的元素放入自己创建的数组中,如果是空格就将其替换为%20,但是是我们自己创建出来的数组需要一个长度的,这个长度我们用极限法假设原字符串都是空格,那么我们都将其替换为%20,%20有三个字符串,假设原字符串长度为N,那么我们自己创建的数组长度应该为3N。

代码如下

public String replaceSpace(String s) {
    int n = s.length();
    char[] newArr = new char[3 * n];
    //极限法求出空间大小
    int j = 0;
    for (int i = 0; i < n; i++) {
        char c = s.charAt(i);
        //替换操作的实现
        if (c == ' ') {
            newArr[j++] = '%';
            newArr[j++] = '2';
            newArr[j++] = '0';
        } else {
            newArr[j++] = c;
        }
    }
    return new String(newArr, 0, j);
}

求空间牺牲速度方法
但是我们可不可以准确知道我们创建出来的数组大小为多少咧?
答案是肯定的,一个空格代表2个字符串,我们可以再加一行代码,来求出空格个数,我们先遍历原字符串,加上一个判断语句,如果遇到空格,就开始计数进行++运算。
这样算出来空格个数乘以3再加上原数组元素个数就是我们创建数组的大小。

代码如下

public String replaceSpace(String s) {
    int n = s.length();
    int cnt = 0;
    //先算出空格的个数
    for (char c : s.toCharArray()) {
        if (c == ' ') cnt++;
    }//新数组的大小
    char[] newArr = new char[n + 2 * cnt];
    int j = 0;
    for (int i = 0; i < n; i++) {
        char c = s.charAt(i);
        //替换操作的实现
        if (c == ' ') {
            newArr[j++] = '%';
            newArr[j++] = '2';
            newArr[j++] = '0';
        } else {
            newArr[j++] = c;
        }
    }
    return new String(newArr);
}

空间复杂度都是 O(n)
时间复杂度都是 O(n)


StringBuilder

首先,我们肯定要遍历一遍字符串的所有字符,因为每个字符都有可能为空。接下来就是考虑当遇到空字符的时候,我们该怎么处理,最直接的想法当然是将空字符串直接替换为 %20,但是你要知道 Java 中的字符串是不变的,所以直接替换是不行的。

我们知道 Java 中有个 StringBuilder 是表达可变的字符串的。我们可以使用 StringBuilder 来实现替换空格,算法步骤如下:
1.初始化一个 StringBuilder 实例 sb
2.遍历字符串 s 的每个字符:
3.当遍历到非空字符的时候,直接将字符 append 到 sb 中
4.如果遍历到的是空字符,那么将 %20 append 到 sb 中
5.返回 sb.toString

代码如下

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();
}

运行结果

最快的算法执行时间0ms
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值