排列是一个物体的有序安排。例如3124是1,2,3,4的一种排列。如果所有的排列按照数值或者字母序排序,我们称其为一个字典序。0,1,2的字典排列有:
012 021 102 120 201 210
0, 1, 2, 3, 4, 5, 6, 7, 8,9的第100万个字典排列是什么?
public class Problem24
{
public static void main(String[] args)
{
long start = System.currentTimeMillis();
System.out.print("answer: ");
howmany();
long end = System.currentTimeMillis();
System.out.print("time: ");
System.out.println(end - start);
}
static void howmany()
{
int re = 1000000; //剩下多少没有去掉
for (int i = 0; i <= 9; i++)
{
re = rest(9 - i, re);
}
System.out.println(answer);
}
static String answer = "";
static boolean isused[] = new boolean[10];//哪些数字用过了
static int rest(int n, int re)
{
int s = jiecheng(n); //获取定下前面几位,剩下的排序是有多少种情况
int nu = 1;
for (int i = 0; i <= 9; i++)
{
if (isused[i])
{
continue;
}
if (re - nu * s <= 0) //<=0 代表这个数是要被使用
{
isused[i] = true;
answer += i+"";
return re - (nu - 1) * s; //n-1不是n
}
nu++;
}
for (int i = 0; i <= 9; i++) //如果上面没有return,说明这个数就是剩下的数中最小的
{
if (isused[i])
{
continue;
}
isused[i] = true;
answer += i+"";
return re - 1;
}
return -1;
}
static int jiecheng(int n)
{
int sum = 1;
for (int i = 2; i <= n; i++)
{
sum *= i;
}
return sum;
}
}
answer: 2783915460
time: 0