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表示退格符,在正則中\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多的獨特方法

  

 

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

  void setLength(int newLength):設置str的長度

  void setCharAt(int index, char ch):將index處設置為ch

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

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM