在一個含有空格字元的字串中加入XXX,演算法時間複雜度為O(N)
阿新 • • 發佈:2018-11-17
import java.util.Scanner; /** * */ /** * @author jueying: * @version 建立時間:2018-10-18 下午10:54:54 * 類說明 */ /** * @author jueying * */ public class Test2 { public void fun(char a[],int num){//原始字元陣列 空格數量 int P1=a.length;//原始陣列的末端位置 14 int P2=P1+2*num;//移動後陣列的末端 20 char removeAfterArr[]=new char[P2]; remove(a,removeAfterArr,P1-1,P2-1); } public void remove(char a[],char removeAfterArr[],int P1,int P2){ for(int i=P1;i>=0;i--){//p1向前移動 15 if(P1!=P2&&P1>0&&P2>0){ System.out.print(a[i]); if(a[i]==' '){//遇到空格時 System.out.println("P2:"+P2+" 空格"+i+" P1:"+P1); removeAfterArr[P2--]='0';//把‘0’複製到當前指向的位置向前一步 removeAfterArr[P2--]='2';//向前一步 removeAfterArr[P2--]='%';//向前一步 --P1; }else{//沒有遇到空格時P1,P2同步從右向左前進(你走一步,我走一步) removeAfterArr[P2]=a[i];//P1指向的當前元素複製到P2 20 --P2; --P1; } }else{ removeAfterArr[P2--]=a[i]; } } System.out.println(); for(int j=0;j<removeAfterArr.length;j++){ System.out.print(removeAfterArr[j]); } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub //思路描述如下 例子 a="abcd ddd dd ee" 長度15 加末尾'\0'結束符號 //1.在上面這個字串a中,空格存在3個,因為需要用%20來替換,所以沒替換一個空格長度會整體增加2,那麼如果有3個空格,替換後的長度就是21 //原字元 abcd ddd dd ee // (1)abcd%20ddd dd ee // (2)abcd%20ddd%20dd ee // (3)abcd%20ddd%20dd%20ee //當只有一個空格時,也就是一個空格需要移動後面的O(n)個字元 //那麼當有O(n)個空格時,時間效率就是O(n^2),直接這樣的去編寫程式碼不會讓面試官滿意的,時間複雜度需要優化 //優化分析 //1.一個空格長度會增加2,那麼3個空格會增加6,我們可以先計算出移動完畢後的陣列空間 //2.用兩個指標P1和P2,P1放在原始陣列的末端,P2放在移動後的陣列的末端 //3.P1從後向前依次移動,把元素分別複製到P2指向的初始位置,從右到左依次放過來,並隨之移動P2的位置,複製一個字元過去,P2向左一步移動 //4.當遇到空格時,從P2指向的位置依次增加字元02%,P2同樣增加一個向左移動一步 //5.重複第3和第4步,沒有遇到空格前,P1依次向左移動把指到的元素依次複製到P2指到的位置,複製一個P2向左移動一步 //當遇到空格時,P1保持不動,依次從右到左增加02%,指導P1和P2指到同一個元素時,移動結束,時間複雜度為N String a="abcd ddd dd ee";//輸入字串 char b[]=a.toCharArray(); int num=0; for(int i=0;i<b.length;i++){ if(b[i]==' '){ ++num; } } Test2 t=new Test2(); t.fun(b,num); } }