【ShawnZhang】带你看蓝桥杯—— 算法提高 排列数

版权声明:本文为博主原创文章,如有转载或提问请私信 https://blog.csdn.net/ShancoFolia/article/details/72609887
问题描述
 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这篇文章,全排列很有用,不过这个子函数并没有被封装,所以还需要自己的书写。





猜你喜欢

转载自blog.csdn.net/ShancoFolia/article/details/72609887
今日推荐