日期:2014-05-20 浏览次数:20646 次
public static void printNumber(int maxNum, int id){ List<String> list1 = new ArrayList<String>(); List<String> list2 = new ArrayList<String>(); long size = 1; for(int i =1;i<=maxNum;i++){ size = size*i; list1.add(""+i); } while(list2.size()<size){ Collections.shuffle(list1); StringBuffer sb = new StringBuffer(); for(int i = 0;i<list1.size();i++){ sb.append(list1.get(i)); } if(list2.contains(sb.toString())==false){ list2.add(sb.toString()); } } Collections.sort(list2); System.out.println(list2.get(id-1)); }
------解决方案--------------------
4楼的方法理论上可行...实现的话要考虑很多阶乘的问题
举例:在n个数排序中找第m个
先一个list存储1-n
一个结果StringBuffer sb
以list[0]开头的有(list.size()-1)!个
以list[1]开头的有(list.size()-1)!个....
用x=m/(n-1)!就知道第几位数,在list中移除这个数,并加在sb 上
同时m = m-x*(n-1)!
又转化成在n-1个元素的全阶乘中找第m-x*(n-1)!个
一直这样做下去知道list.size()=2,找第1个还是第2个,就可以返回结果;
举例:
在3个数的全排列找第五个:
m=5;
list存放{1、2、3}
5/(3-1)! = 2,拿出第二个下标的数=3 ,同时m=5-2*(3-1)! = 1,list移除3剩下{1,2}
转成从{1,2}的排列中找第一个,肯定是12
得出结果312
例2:在4个元素中找第7个
m=7; list存{1,2,3,4}
7/3! = 1,拿出第一个数字为2,m=7-1*3!= 1,list移除2剩下{1,3,4}
1/2!=0,拿出第0个数字为1,m=1-0*2!=1,list移除1剩下{3,4}
在{3,4}的排列中找第一个,结果34
所以最后结果为2134
程序我就不写了,这个不大容易理解
------解决方案--------------------
不明白