问题描述
0、1、2三个数字的全排列有六种,按照字母序排列如下:
012、021、102、120、201、210
输入一个数n
求0~9十个数的全排列中的第n个(第1个为0123456789)。
输入格式
一行,包含一个整数n
输出格式
一行,包含一组10个数字的全排列
样例输入
1
样例输出
0123456789
数据规模和约定
主要还是用了一个全排列的方式,加了一个判断,具体可以参照http://blog.csdn.net/shancofolia/article/details/72585013这篇文章,全排列很有用,不过这个子函数并没有被封装,所以还需要自己的书写。
0、1、2三个数字的全排列有六种,按照字母序排列如下:
012、021、102、120、201、210
输入一个数n
求0~9十个数的全排列中的第n个(第1个为0123456789)。
输入格式
一行,包含一个整数n
输出格式
一行,包含一组10个数字的全排列
样例输入
1
样例输出
0123456789
数据规模和约定
0 < n <= 10!
接下来先发满分代码
import java.util.Arrays;
import java.util.Scanner;
public class ADV188 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int[] a={0,1,2,3,4,5,6,7,8,9};
int i=1,j=0;
if(i==n)for(int k:a)
System.out.print(a[k]);
else{
while(i!=n){
i++;
nextPermutation(a);
if(i==n){
for(int k=0;k<10;k++)
System.out.print(a[k]);
}
}
}
}
private static boolean nextPermutation(int[] num) {
// TODO Auto-generated method stub
if(num.length<=1)return false;
for(int i = num.length - 2; i >= 0; i--)
{
if(num[i] < num[i+1])
{
int j;
for(j = num.length - 1; j >= i; j--)
if(num[i] < num[j])
break;
// swap the two numbers.
num[i] = num[i] ^ num[j];
num[j] = num[i] ^ num[j];
num[i] = num[i] ^ num[j];
//sort the rest of arrays after the swap point.
Arrays.sort(num, i+1, num.length);
return true;
}
}
//reverse the arrays.
for(int i = 0; i < num.length / 2; i++)
{
int tmp = num[i];
num[i] = num[num.length - i - 1];
num[num.length - i - 1] = tmp;
}
return false;
}
}
主要还是用了一个全排列的方式,加了一个判断,具体可以参照http://blog.csdn.net/shancofolia/article/details/72585013这篇文章,全排列很有用,不过这个子函数并没有被封装,所以还需要自己的书写。