2014年美團校招之——輸出字典序爲第k的排列(0


思路:

比如:n=4,k=6(k從0開始計數),那麼就是從找第四個數,那麼看規律


(第一隊)
 1234
 1243
 1324
 1342
 1423
 1432
 

(第二隊)
 2134
 2143
 2314
 2341
 2413
 2431
 
(第三隊)
 。。。。


 我們從第一個數字開始確定,由於確定第一個數了,那麼後面的排列組合數是(n-1)!也就是6。問題就是如何確定第一個數,這裏k=6,我們算出 k/n=1,說明這個數在第二隊中。 那麼我們應該把2移到最前面,此時排列就變成了2134。此時問題變爲在第二隊中找出第k%n=0個數,由於第一個數已經定了,那麼我們應該在134中找出第0個數。以此類推。


代碼如下:

	//求n的階乘
	public int getFactorial(int n){
		if(n<0)
			return 0;
		else if(n==0)
			return 1;
		else
			return n*getFactorial(n-1);
	}
	
	
	public String findTheKNum(int n , int k){
		int countOfN = getFactorial(n);
		if(k>countOfN-1||k<0)
			return null;
		
		LinkedList<Integer> list = new LinkedList<Integer>();
		for(int i = 1 ; i<=n ; i++){
			list.add(i);
		}
		for(int exchangeIndex = 0 ; exchangeIndex<list.size()-1 ; exchangeIndex++){
			if(k==0)
				break;
			int fact = getFactorial(n-exchangeIndex-1);
			int index = k/fact;
			k = k%fact;
			index = index + exchangeIndex;
			list.add(exchangeIndex, list.get(index));
			list.remove(index+1);
			
		}
		
		StringBuffer strbuf = new StringBuffer();
		
		for(Integer in : list)
			strbuf.append(in);
		
		return strbuf.toString();
	}


 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章