剑指 Offer 05. 替换空格 三种方法

剑指 Offer 05. 替换空格(点击立即答题
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

示例 1:

输入:s = “We are happy.”
输出:“We%20are%20happy.”

限制:

0 <= s 的长度 <= 10000

这是一道非常简单的题,简单题有简单题的要求,就是尽可能时间快,内存使用少,有的面试就喜欢考这种,每个人都会做,但是总有一些人的做法不一样,那样更快,内存占用更少。

解题思路:

1.创建一个字符类型数组aar,在最坏的情况下,字符串s全部为空格,那么arr大小定义为s.length()* 3;

2.对字符串s进行遍历,如果是空格,arr中依次加入‘%’、‘2’、‘0’,如果不是加入s.charAt(i)

3.返回字符串(注意:是返回字符串,不是数组,要把数组变成字符串)
java代码:

class Solution {
    public String replaceSpace(String s) {
        int n = s.length();
       
        int size = 0;
        char[] arr = new char[n * 3];
        for (int i = 0 ; i < n ; i++) {
            char temp = s.charAt(i);
            if (temp == ' ') {
                arr[size++] = '%';
                arr[size++]= '2';
                arr[size++] = '0';
            }else {
                arr[size++] = temp;
            }
        }
        String newStr = new String(arr , 0 , size);
        return new String(newStr);
    }
}

这是LeetCode的官方做法,内存消耗较大,我们不要将数组arr定义为s.length()* 3,我们在99.9%的情况下是用不到这么大的内存的,我们可以定义一个count来统计空格的个数,最后将arr大小定义为s.length() + count * 2。

class Solution {
    public String replaceSpace(String s) {
        int n = s.length();
        int count = 0;
        for (int i = 0 ; i < n ; i++) {
            if (s.charAt(i) == ' ') {
                count++;
            }
        }
        int size = 0;
        char[] arr = new char[n + count * 2];
        for (int i = 0 ; i < n ; i++) {
            char temp = s.charAt(i);
            if (temp == ' ') {
                arr[size++] = '%';
                arr[size++]= '2';
                arr[size++] = '0';
            }else {
                arr[size++] = temp;
            }
        }
        return new String(arr);
    }
}

即使这样内存使用还是很大,我们在这里继续进阶一下,在java中有一个类叫做StringBuilder,他对于拼接字符串具有很快的速度。

java代码:

class Solution {
    public String replaceSpace(String s) {
        int n = s.length();
       
        StringBuilder sb = new StringBuilder();
        for (int i = 0 ; i < n ;i++) {
            if(s.charAt(i) == ' ') {
                sb.append("%20");
            }else{
                sb.append(s.charAt(i));
            }
        }
        return sb.toString();
    }
}

在这里说明一下,LeetCode每次提交他给的内存消耗可能不一样,这可能是网速的问题。

若有误,请指教!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值