zoukankan      html  css  js  c++  java
  • 001 字符串中替换掉原有的空格

    一:程序的主题

    1.题目

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

    2.我的程序

     1 package com.jianke.it;
     2 
     3 public class ReplaceSpace {
     4 
     5     public static void main(String[] args) {
     6         StringBuffer str=new StringBuffer("We Are Happy");
     7         String result=replaceSpace(str);
     8         System.out.println(result);
     9     }
    10     public static String replaceSpace(StringBuffer str) {
    11         StringBuffer str2=new StringBuffer();
    12         int len=str.length();
    13         for(int i=0;i<len;i++) {
    14             if(str.charAt(i)!=' ') {
    15                 str2.append(str.charAt(i));
    16             }else {
    17                 str2.append("%20");
    18             }
    19         }
    20         
    21         return str2.toString();
    22     }
    23 
    24 }

    3.效果

      

    4.程序二

    问题1:替换字符串,是在原来的字符串上做替换,还是新开辟一个字符串做替换!
    问题2:在当前字符串替换,怎么替换才更有效率(不考虑java里现有的replace方法)。
          从前往后替换,后面的字符要不断往后移动,要多次移动,所以效率低下
          从后往前,先计算需要多少空间,然后从后往前移动,则每个字符只为移动一次,这样效率更高一点。
    结论:我的方法是新开辟了一个字符串,这个方法是在原有的基础上进行修改。
     1 package com.jianke.it;
     2 
     3 public class ReplaceSpace {
     4 
     5     public static void main(String[] args) {
     6         StringBuffer str=new StringBuffer("We Are Happy");
     7         String result=replaceSpace(str);
     8         System.out.println(result);
     9     }
    10     public static String replaceSpace(StringBuffer str) {
    11         //spacenum为计算空格数
    12         int spacenum = 0;
    13         for(int i=0;i<str.length();i++){
    14             if(str.charAt(i)==' ')
    15                 spacenum++;
    16         }
    17         //indexold为为替换前的str下标
    18         int indexold = str.length()-1; 
    19         //计算空格转换成%20之后的str长度
    20         int newlength = str.length() + spacenum*2;
    21         //indexold为为把空格替换为%20后的str下标
    22         int indexnew = newlength-1;
    23         //使str的长度扩大到转换成%20之后的长度,防止下标越界
    24         str.setLength(newlength);
    25         for(;indexold>=0 && indexold<newlength;--indexold){
    26             if(str.charAt(indexold) == ' '){
    27                 str.setCharAt(indexnew--, '0');
    28                 str.setCharAt(indexnew--, '2');
    29                 str.setCharAt(indexnew--, '%');
    30             }else{
    31                 str.setCharAt(indexnew--, str.charAt(indexold));
    32             }
    33         }
    34         return str.toString();
    35     }
    36 
    37 }

    5.分析

      1.&& indexold<newlength

        主要分析一下这个条件,如果不要也不会由问题,但是,现在为什么还要加。

        我思考了一下,是这样的:

        如果,后面的空格已经补充完了之后,这个时候的indexold与indexnew已经相同的,就不要再移动了,就可以降低时间复杂度。

      2.注意点

        要设置str的长度,不然会越界。

    6.程序三

    /*

    思路

    使用string中的正则表达式

    */

     1 package com.jianke.it;
     2 
     3 public class ReplaceSpace {
     4 
     5     public static void main(String[] args) {
     6         StringBuffer str=new StringBuffer("We Are Happy");
     7         String result=replaceSpace(str);        
     8         System.out.println(result);
     9         
    10     }
    11     public static String replaceSpace(StringBuffer str) {    
    12         return str.toString().replaceAll("\s", "%20");
    13     }
    14     
    15 }

    7.分析

      s在正则里就表示空白符
      用\s是因为所使用的工具本身就具有转义的功能,比如表示退格符,在正则中(不在中括号中)表示单词边界,要将字符串传给正则就得首先对转义 ,用\表示 \, \b表示
      同理在这些本身具有转义作用的工具中,要将字符串s传给正则用要\s

      下面的方式也可以:

    1 return str.toString().replaceAll(" ", "\%20");
    2 return str.toString().replaceAll(" ", "%20");

    二:补充知识

    1.StringBuffer与StringBuilder  

      StringBuffer 和 StringBuilder 长度可变

      StringBuffer 线程安全 StringBuilder 线程不安全,因此StringBuilder 速度快

    2.StringBuffer比String多的独特方法

      

    3.在StringBuffer中常用的还有下面的方法

      void setLength(int newLength):设置str的长度

      void setCharAt(int index, char ch):将index处设置为ch

      char charAt(int index):返回str中index处的char值

  • 相关阅读:
    7.内网渗透之windows认证机制
    10.Python之Ansible自动化运维常用模块
    9.python 系统批量运维管理器之Fabric模块
    8.python 系统批量运维管理器之pexpect模块
    7.python实现高效端口扫描器之nmap模块
    6.python探测Web服务质量方法之pycurl模块
    5.python之pip安装模块失败
    4.python 系统批量运维管理器之paramiko模块
    3.python 发送邮件之smtplib模块
    微慕WordPress小程序增强版
  • 原文地址:https://www.cnblogs.com/juncaoit/p/9000125.html
Copyright © 2011-2022 走看看