1. 程式人生 > >在一個含有空格字元的字串中加入XXX,演算法時間複雜度為O(N)

在一個含有空格字元的字串中加入XXX,演算法時間複雜度為O(N)

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);
	
	}

}