一:程序的主题

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.效果

  001 字符串中替换掉原有的空格_正则

 

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表示退格符,在正则中\b(不在中括号中)表示单词边界,要将字符串\b传给正则就得首先对\转义 ,用\\表示 \, \\b表示\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多的独特方法

  001 字符串中替换掉原有的空格_i++_02

 

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

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

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

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