2014年美团校招之——输出字典序为第k的排列(0<=k<n!)

思路:

比如: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();
	}
时间: 2024-10-26 10:38:05

2014年美团校招之——输出字典序为第k的排列(0<=k<n!)的相关文章

2014年美团校招之——服务器调度

思路: t[i] 表示第i台服务器完成一项任务所需要的时间,m台服务器,n个任务,实际上就是尽量是某台机器完成任务所花费的时间最短. public int estimateProcessTime(int[] t , int m , int n){ //每台服务器的任务数数组 int[] numOfTask = new int[m]; int min = -1; //开始尝试分配任务 for(int i = 0; i < n ; i++){ min = (numOfTask[0] + 1) * t

2014年美团校招之——求An

思路: 求出A(n)的递推式:A(n) = 1+xA(n-1) public int getAn(int x , int n){ if(n==0) return 1; return 1+x*getAn(x, n-1); }

2014年美团校招之——二维数组逆时针旋转45度后打印

思路: 沿着斜线打印即可. public void print_rotate_matrix(int[] matrix , int n){ if(n<0||matrix==null||matrix.length==0) return; //打印右上角 for(int i = n-1; i>=0 ; i--){ int j = i; while((j+1)%n!=0) { System.out.print(matrix[j]+" "); j+=(n+1); } System.o

【转载】2014 IT公司校招应届生待遇大揭秘

2014 IT公司校招应届生待遇大揭秘 公司名称        职位类别        待遇(校招年份) 百度                  开发类                13K*14.6 + 800饭补(400+20*20) (2014) (注:今年百度相对比较多的人拿了special)                  测试类.前端类      12K*14.6 + 800饭补(400+20*20)  (2014)                  产品本硕           

HDU 1848 2SAT 输出字典序最小

告诉你两两冲突的序列,让输出字典序最小. 一开始老老实实tarjan,写完了发现后面完全不能好弄,因为选了第一个点,你没办法快速找出全部对立组,只能找出本来在一个pair中的那个对立组,而找不出给定的那个随意的对立组.所以直接从1开始染色,弄不出来就染2.以此类推. 这个题还有一个教训就是,点要多开一倍,边也要多开一倍.老是忘... #include<algorithm> #include<iostream> #include<cstdio> #include<c

三道习题(1、将单词表中由相同字母组成的单词归成一类,每类单词按照单词的首字母排序,并按 #每类中第一个单词字典序由大到小排列输出各个类别。 #输入格式:按字典序由小到大输入若干个单词,每个单词占一行,以end结束输入。)

#coding=gbk ''' 1.将单词表中由相同字母组成的单词归成一类,每类单词按照单词的首字母排序,并按 #每类中第一个单词字典序由大到小排列输出各个类别. #输入格式:按字典序由小到大输入若干个单词,每个单词占一行,以end结束输入. #cinema #iceman #maps #spam #aboard #abroad #end #输出格式:一类单词一行,类别间单词以空格隔开. #aboard abroad #cinema iceman #maps spam ''' result=[]

微软2014实习生及校招秋令营技术类职位,在线编程题目及解答。

题目1 : String reorder 时间限制:10000ms 单点时限:1000ms 内存限制:256MB Description For this question, your program is required to process an input string containing only ASCII characters between '0' and '9', or between 'a' and 'z' (including '0', '9', 'a', 'z'). Y

ZOJ 3204 Connect them(最小生成树之Krusal 输出字典序最小的)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3367 You have n computers numbered from 1 to n and you want to connect them to make a small local area network (LAN). All connections are two-way (that is connecting computers i and j is

hdu 1814 Peaceful Commission (2-sat 输出字典序最小路径)

Peaceful Commission Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1948    Accepted Submission(s): 560 Problem Description The Public Peace Commission should be legislated in Parliament of Th