zoukankan      html  css  js  c++  java
  • 剑指offer二之替换空格

    一、题目:

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

    二、解题方法:

      方法1:采用String的repalceAll方法

    public class Reword {
        public static void main(String[] args) {
            StringBuffer str = new StringBuffer("I love you");
            String str_new = replaceSpace(str);
            System.out.println(str_new);
        }
    
        private static String replaceSpace(StringBuffer str) {
            String str_new = str.toString().replaceAll(" ", "20%");
            return str_new;
        }
    }

      方法2:创建新的字符串,将旧的字符串一次放入新的字符串,当遇到空格的时候,进行替换

    public class Reword {
        public static void main(String[] args) {
            StringBuffer str = new StringBuffer("I love you");
            String str_new = replaceSpace(str);
            System.out.println(str_new);
        }
    
        private static String replaceSpace(StringBuffer str) {
            if (str == null) {
                return null;
            }
            StringBuilder stb = new StringBuilder();
            for (int i = 0; i < str.length(); i++) {
                if (str.charAt(i) == ' ') {  //遇到空格
                    stb.append('%');
                    stb.append('2');
                    stb.append('0');
                } else {
                    stb.append(str.charAt(i));
                }
            }
            return stb.toString();
        }
    }

      方法3:先遍历查询所有的空格数量,然后从字符串的后面往前进行遍历替换

    public class Reword {
        public static void main(String[] args) {
            StringBuffer str = new StringBuffer("I love you");
            String str_new = replaceSpace(str);
            System.out.println(str_new);
        }
    
        private static String replaceSpace(StringBuffer str) {
            //从后往前替换
            int numspace = 0;//空格数
            for (int i = 0; i < str.length(); i++) {
                if (str.charAt(i) == ' ')//遇到空格
                    numspace++;
            }
    
            int oldindex = str.length() - 1;//替换前下标
            int newlength = str.length() + numspace * 2;//替换之后str长度,z注意乘以2,而不是3
            int newindex = newlength - 1;//替换后下标
            str.setLength(newlength);//扩展长度
            for (; oldindex >= 0 && oldindex < newlength; oldindex--) {
                if (str.charAt(oldindex) == ' ') {
                    /*遇到空格进行替换(从后向前)*/
                    str.setCharAt(newindex--, '0');
                    str.setCharAt(newindex--, '2');
                    str.setCharAt(newindex--, '%');
                    numspace--;//空格数量减1
                    if (numspace == 0) break;//空格填完,跳出循环
                } else {
                    str.setCharAt(newindex--, str.charAt(oldindex));
                }
            }
            return str.toString();
        }
    }

    附:StringBuffer的用法

    1、StringBuffer对象的初始化

      StringBuffer对象的初始化不像String类的初始化一样,Java提供的有特殊的语法,而通常情况下一般使用构造方法进行初始化。例如:

                                                                    StringBuffer s = new StringBuffer();

    这样初始化出的StringBuffer对象是一个空的对象,就是我犯的错误。如果需要创建带有内容的StringBuffer对象,则可以使用:

                                                                  StringBuffer s = new StringBuffer(“abc”);

    这样初始化出的StringBuffer对象的内容就是字符串”abc”。需要注意的是,StringBuffer和String属于不同的类型,也不能直接进行强制类型转换,下面的代码都是错误的:

                                                                StringBuffer s = “abc”; //赋值类型不匹配

                                                                StringBuffer s = (StringBuffer)”abc”; //不存在继承关系,无法进行强转

    StringBuffer对象和String对象之间的互转的代码如下:

                                                                String s = “abc”;

                                                                StringBuffer sb1 = new StringBuffer(“123”);

                                                               StringBuffer sb2 = new StringBuffer(s); //String转换为StringBuffer

                                                               String s1 = sb1.toString(); //StringBuffer转换为String

    2、StringBuffer的常用方法

      StringBuffer类中的方法主要偏重于对于字符串的变化,例如追加、插入和删除等,这个也是StringBuffer和String类的主要区别。

    (1)append方法

                                                  public StringBuffer append(boolean b)

    该方法的作用是追加内容到当前StringBuffer对象的末尾,类似于字符串的连接。调用该方法以后,StringBuffer对象的内容也发生改变,例如:

                                                 StringBuffer sb = new StringBuffer(“abc”);

                                                 sb.append(true);

    则对象sb的值将变成”abctrue”。使用该方法进行字符串的连接,将比String更加节约内容,例如应用于数据库SQL语句的连接,例如:

                                                 StringBuffer sb = new StringBuffer();

                                                String user = “test”;

                                                String pwd = “123”;

                                               sb.append(“select * from userInfo where username=“) .append(user).append(“ and pwd=”).append(pwd);

    这样对象sb的值就是字符串“select * from userInfo where username=test and pwd=123”。

    (2)deleteCharAt方法

                                                                                       public StringBuffer deleteCharAt(int index)

    该方法的作用是删除指定位置的字符,然后将剩余的内容形成新的字符串。例如:

                                                                                       StringBuffer sb = new StringBuffer(“Test”);

                                                                                       sb. deleteCharAt(1);

    该代码的作用删除字符串对象sb中索引值为1的字符,也就是删除第二个字符,剩余的内容组成一个新的字符串。所以对象sb的值变为”Tst”。还存在一个功能类似的delete方法:

                                                                                      public StringBuffer delete(int start,int end)

    该方法的作用是删除指定区间以内的所有字符,包含start,不包含end索引值的区间。例如:

                                                                                    StringBuffer sb = new StringBuffer(“TestString”);

                                                                                    sb. delete (1,4);

    该代码的作用是删除索引值1(包括)到索引值4(不包括)之间的所有字符,剩余的字符形成新的字符串。则对象sb的值是”TString”。

    (3)insert方法

                                                             public StringBuffer insert(int offset, boolean b)

    该方法的作用是在StringBuffer对象中插入内容,然后形成新的字符串。例如:

                                                             StringBuffer sb = new StringBuffer(“TestString”);

                                                             sb.insert(4,false);

    该示例代码的作用是在对象sb的索引值4的位置插入false值,形成新的字符串,则执行以后对象sb的值是”TestfalseString”。

    (4)reverse方法

                                                             public StringBuffer reverse()

    该方法的作用是将StringBuffer对象中的内容反转,然后形成新的字符串。例如:

                                                           StringBuffer sb = new StringBuffer(“abc”);

                                                            sb.reverse();

    经过反转以后,对象sb中的内容将变为”cba”。

    (5)setCharAt方法

                                                         public void setCharAt(int index, char ch)

    该方法的作用是修改对象中索引值为index位置的字符为新的字符ch。例如:

                                                       StringBuffer sb = new StringBuffer(“abc”);

                                                       sb.setCharAt(1,’D’);

    则对象sb的值将变成”aDc”。

    (6)trimToSize方法

                                                    public void trimToSize()

    该方法的作用是将StringBuffer对象的中存储空间缩小到和字符串长度一样的长度,减少空间的浪费。

      总之,在实际使用时,String和StringBuffer各有优势和不足,可以根据具体的使用环境,选择对应的类型进行使用。

    参考链接:http://www.cnblogs.com/liu-chao-feng/p/5636063.html

         http://blog.csdn.net/qq_28796345/article/details/68948358

  • 相关阅读:
    ABP 开发(一)
    转发: Angular装饰器
    AJAX上传文件到服务器
    转:system.Security.Cryptography C# 加密和解密
    asp.net mvc5 step by step(四)——关于Controller的ActionResult
    asp.net mvc5 step by step(三)—— Entity Framework Database First
    asp.net mvc5 step by step(二)——Data Annotations(data 注释)
    项目中使用protobuf
    架构私用Nuget服务器
    dockerfile语法
  • 原文地址:https://www.cnblogs.com/hezhiyao/p/7405134.html
Copyright © 2011-2022 走看看