【我的演算法日記】請實現一個函式,把字串中的每個空格替換成“%20”。例如輸入“We are happy.”,則輸出“We%20are%20happy.”。
阿新 • • 發佈:2019-01-22
請實現一個函式,把字串中的每個空格替換成“%20”。例如輸入“We are happy.”,則輸出“We%20are%20happy.”。在劍指offer中有這樣一道題目,我已經既不清楚了,我記得該題好像不準使用輔助空間,需要在遠字串上進行操作,如果在java中,直接用replaceAll方法就可以完成,但為了練習一些基本的演算法,我決定利用java,按自己的理解,寫下實現過程。第一篇練習演算法的博文,本身演算法就很差,大家多多包含。
首先分析該問題,
假設1:我們拋開時間複雜度和空間複雜度框框,你能想到什麼辦法。第一種,首先獲得源字串的總長度,然後獲得字串中空格的數目,空格的ASCII為32。因為沒出現一個空格,就換多增加三個字元,所以替換後的長度為:源字串長度+空格數目*2。獲取空格數目後,增加一個輔助陣列,長度為新字串的長度(空格變為%20),依次掃描源字串,把源字串中的字元依次新增到新字串的末尾,指標依次掃描新字串下標,為什麼我這樣寫,從前往後加滿腦子沒轉過來,只有這種辦法了。<**>,遇到空格則做特殊處理。依次往下,當掃描完所有源字元陣列的時候,你可以用java的reverse方法進行逆置,也就是反轉,獲得新字串。但我沒這樣做,再一次掃描新字串長度的1/2,新字串的首尾進行交換,得到新字串,總的來說時間複雜度為:源字串掃描次數+新字串長度的*1/2=0*(n);估計要被噴。輔助空間為源字串長度+空格數目*2的字元陣列。
假設2:獲取空格數目,再元字串上新增加空間,設立兩個指標,一個指向源字串第一個元素,一個指向元字串的末尾,依次掃描字串,遇到空格則末指標進行移動,兵替換空格,直到源指標與末指標相等,則完成替換。(沒這樣寫)。
程式碼寫的稀里嘩啦:
package com.lb.test; import java.util.Scanner; public class ReplaceSpace { public static void main(String[] args) { String str = ""; int newIndex = 0; Scanner in = new Scanner(System.in); str = in.nextLine(); /** * 首先遍歷整個字串,找出字串中總共包含的空格數量,新增一個輔助陣列 */ char []strArray = str.toCharArray(); int oldLength = strArray.length; char []newArray = null ; int countSpace = 0;//空格數目 for(char i:strArray){ if((int)i==32){ ++countSpace; } } newArray = new char [2*countSpace+oldLength];//沒發現一個空格,新陣列的長度就要加2 newIndex = newArray.length-1; for(int i = 0;i<oldLength;i++){ if((int)strArray[i]==32){ newArray[newIndex]='%'; newArray[newIndex-1]='2'; newArray[newIndex-2]='0'; newIndex-=3; }else{ newArray[newIndex] = strArray[i]; newIndex-=1; } } System.out.println("轉換前的反字串為:"); for(char i:newArray){ System.out.print(i); } System.out.println("\n"); /** * 將字元陣列反轉,java中直接利用reverse,但為了練習演算法, */ int middle = newArray.length/2; for(int i=0;i<middle;++i){ char temp; temp = newArray[i]; newArray[i] = newArray[newArray.length-i-1]; newArray[newArray.length-i-1] = temp; } System.out.println("替換後的字串為:"); for(char i:newArray){ System.out.print(i); } } }