• 剑指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了吗?

  • 相关阅读:
    Circular vector
    【杂题】进制转换
    【POJ】3006
    【POJ】1503
    【POJ】2262
    【POJ】1083
    【POJ】2739
    对拍
    【POJ】2159
    【POJ】3299
  • 原文地址:https://www.cnblogs.com/JefferyChenXiao/p/12246249.html
Copyright © 2020-2023  润新知