一:程序的主題
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值