1. 程式人生 > >2014年美團校招之——輸出字典序為第k的排列(0

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


 

相關推薦

2014團校——輸出字典k排列0

思路: 比如:n=4,k=6(k從0開始計數),那麼就是從找第四個數,那麼看規律 (第一隊)  1234  1243  1324  1342  1423  1432   (第二隊)  2134  2143  2314  2341  2413  2431   (第三隊)

2014團校——二維陣列逆時針旋轉45度後列印

思路: 沿著斜線列印即可。 public void print_rotate_matrix(int[] matrix , int n){ if(n<0||matrix==null||matrix.length==0) return; //列

08頭條實習生面試_字典K小數字

LeetCode(440) 字典序的第K小數字 思路: 其實這是一個"十叉樹",如下圖: 1)每個節點的子節點可以有十個,比如節點1的子節點可以是10~19、節點2的位元組的可以是20~29、。。。 但是由於n大小的限制,構成的並不是一個"滿十叉樹"。 2)分

2014屆校江蘇銀行蘇州分行,工商銀行蘇州分行,農商行計算機崗面試經驗

     先說一下筆試環節,江蘇銀行和工行不分專業,農商行是分專業的。江蘇銀行12月1日面試,工行5號,而農商行的筆試是7日,最後我報考的那家農商行是28號面試,31號給體檢通知的。江蘇銀行的筆試是在南財仙林校區考的,紙質試卷,當天缺考的人非常多,我們考場

2019團校一道程式設計題

樣例輸入: 4 20 20 100 60 50 30 80 55 100 60 110 88 5 3 10 6 樣例輸出: 94   分析: 經典01揹包問題參考:https://blog.csdn.net/u011321546/article

最大差值團校真題)

題目描述 有一個長為n的陣列A,求滿足0≤a≤b<n的A[b]-A[a]的最大值。 給定陣列A及它的大小n,請返回最大差值。 測試樣例: [10,5],2 返回:0 實現程式碼

團校筆試題

大富翁遊戲(類似於變態跳青蛙問題) #include <iostream> using namespace std; int main() { int n, ans; cin>>n; if(n<0) re

HDU 1385 Minimum Transport Cost (輸出字典最小路徑)【最短路】

<題目連結> 題目大意:給你一張圖,有n個點,每個點都有需要繳的稅,兩個直接相連點之間的道路也有需要花費的費用。現在進行多次詢問,給定起點和終點,輸出給定起點和終點之間最少花費是多少,並且輸出最少花費所走的路徑,如果有多條路徑花費最少,則輸出字典序最小的那條。 解題分析: 輸出最短路的路徑問

輸出字典最小的拓撲排序

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<vector> #define

3693 求這串字元中的重複次數最多的連續重複子串,多組答案輸出字典最小的那個串字尾陣列)

題目:求這串字元中的重複次數最多的連續重複子串,多組答案輸出字典序最小的那個串。 思路:與前一個題目幾乎一樣的,加上了字典序。多判斷就好 //#include<bits/stdc++.h> #include<iostream> #include

Cocos2d-x 3.4 消滅星星 &gt; 三篇終) &lt;

周期 ack ini 顏色 博客 ec2 width pri mp3格式 ***************************************轉載請註明出處:http://blog.csdn.net/lttree************************

劍指offer十四鏈表中倒數k個結點

gif img https question pla last 代碼 鏈表 || 一、題目 輸入一個鏈表,輸出該鏈表中倒數第k個結點。 二、思路   兩個指針,先讓第一個指針和第二個指針都指向頭結點,然後再讓第一個指正走(k-1)步,到達第k個節點。然後兩個指針同

《劍指offer》---輸出鏈表倒數k個結點

頭結點 ndk 空間 過程 長度 循環 init find tail 本文算法使用python3實現 1. 問題1 1.1 題目描述: ??輸入一個鏈表,輸出該鏈表中倒數第k個結點。 ??時間限制:1s;空間限制:32768K 1.2 思路描述: ??方法一:當鏈表長度

【劍指offer】輸出鏈表倒數K個元素

ndk head 判斷 result i++ != == col list 1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(

劍指offer刷題連結串列中倒數k個結點

題目描述 輸入一個連結串列,輸出該連結串列中倒數第k個結點。 # -*- coding:utf-8 -*- # class ListNode: #     def __init__(self, x): #         s

劍指offer連結串列中倒數K個結點

連結串列中倒數第K個結點 輸入一個連結串列,輸出該連結串列中倒數第k個結點。 思路:使用兩個指標,先讓第一個指標和第二個指標都指向頭結點,然後再讓第一個指正走(k-1)步,到達第k個節點 然後兩個

輸出連結串列倒數k個結點

 問題描述: 輸入一個連結串列,輸出該連結串列中倒數第k個結點。 解題思想: 若連結串列為空或者k為0,則返回的是None。 當連結串列不為空時,有兩種情況: 連結串列長度n<k時,不存在倒數第k個結點,則返回None。 連結串列長度n>k時,設定一個長

[LeetCode] K-th Smallest in Lexicographical Order 字典順序的K小數字

Given integers n and k, find the lexicographically k-th smallest integer in the range from 1 to n. Note: 1 ≤ k ≤ n ≤ 109. Example: Input: n: 13 k:

牛客網刷題連結串列中倒數k個結點

題目描述:    解題思路:   強解法:先遍歷連結串列得出所有節點的個數n,再遍歷一次得到n-k+1節點就是所得到的結果,這一共遍歷了兩次,這基本是不能通過測試的,當然也不會是我們想要的;   看到倒數兩個字有沒有想到棧的先進後出特點,那我們是不是

輸出連結串列倒數k個數

// ConsoleApplication4.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include <stdio.h> #include <stdlib.h> typedef struct MySt