为了账号安全,请及时绑定邮箱和手机立即绑定

剑指Offer对答如流系列 - 替换空格

标签:
算法 面试

面试题4:替换空格

题目:请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入“We are happy.”,则输出“We%20are%20happy.”。

在这里插入图片描述
在网络编程中,如果URL参数中含有特殊字符,如空格、’#‘等,可能导致服务器端无法获得正确的参数值。我们需要将这些特殊符号转换成服务器可以识别的字符。转换的规则是在’%‘后面跟上ASCII码的两位十六进制的表示。比如空格的ASCII码是32,即十六进制的0x20,因此空格被替换成"%20"。再比如’#'的ASCII码为35,即十六进制的0x23,它在URL中被替换为"%23"。

工欲善其事必先利其器,Java在字符串方面提供非常多的API,供我们使用,极大方便了我们对字符串的操作。

不过就这道题而言,解法还是比较简单的。

解法一

新建字符串,遍历原字符串,当发现空格时,在新字符串添加%20,否则添加原字符串中的数据,不改变原数据。这个是非常传统的解法。对Java的API最直观的运用。不过在解法二中,会进行代码量上的优化(实际上是选择了更好用的API)

    public String replaceSpace(StringBuffer str) {
        if (str == null) {
            return null;
        }
        StringBuffer newStr = new StringBuffer();
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == (' ')) {
                newStr.append('%');
                newStr.append('2');
                newStr.append('0');
            } else {
                newStr.append(str.charAt(i));
            }

        }
        return newStr.toString();

    }

解法二

遍历字符串,当发现空格时,替换空格,改变原数据

   public String replaceSpace(StringBuffer str) {
        if (str == null) {
            return null;
        }
        int i = 0, j;
        while (i < str.length()) {
            if ((j = str.indexOf(" ")) != -1) {
                str.replace(j, j + 1, "%20");
                i += 2;
            }
            i++;
        }
        return str.toString();
    }

如果你对String比较熟悉,看过相关的源码,建议看一下StringBuffer和StringBuilder的源码。

做工程成长最快的方式就是阅读,学习优秀的代码。

解法三

直接把StringBuffer转换成String调用replaceAll方法,改变原数据。

这部分是Java正则表达式的运用。如果你懂正则表达式,那么字符串处理方面,你将有了一个非常大的优势。

   public String replaceSpace_2(StringBuffer str) {
        if (str == null) {
            return null;
        }
        return str.toString().replaceAll(" ", "%20");
    }

上面这道字符串的题是非常简单的,并没有牵扯到复杂的算法。这道题就重在提醒大家,要熟练掌握Java常用的API,同时,在字符串方面,建议好好学习一下Java的正则表达式,我认为“正则表达式”的运用这项技能还是很有必要的,其次有些第三方依赖,如commons-lang3对已有的Java字符串相关的API再一次进行封装,简化我们的处理,阅读它的源码将对你很有帮助,除此之外,还有String、StringBuffer以及StringBuilder的源码级认识也是不可缺少的。

本篇文章内容虽简单,但是我想传达给你的,你Get了吗?

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消