java 输出全排列组合,求思路

给定参数 n,从 1 到 n 会有 n 个整数:1,2,3,…,n,这 n 个数字共有 n! 种排列。
按大小顺序升序列出所有排列情况,并一一标记
例:当 n = 3 时, 所有排列如下:
"123"
"132"
"213"
"231"
"312"
"321"
给定 n 和 k,返回第 k 个排列。
输入描述:输入两行,第一行为 n,第二行为 k,给定 n 的范围是 [1,9],给定 k 的范围是[1,n!]。
输出描述:输出排在第 k 位置的数字。

输入
3
3
输出
213
说明:3 的排列有 123 132 213...,那么第 3 位置的为 213

最基础的方法是按照既定规则枚举所有值,输出指定序号的值。
然后优化算法,省去不必要的计算,主要是找n,k和整个排列组合集合之间的关系,用较少的计算得到需要的结果。

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7623018
  • 除此之外, 这篇博客: 王道oj练习中的 假如有n个台阶,一次只能上1个台阶或2个台阶,请问走到第n个台阶有几种走法?为便于读者理解题意,这里举例说明如下:假如有3个台阶,那么总计就有3种走法:第一种为每次上1个台阶,上3次;第二种为先上2个台阶,再上1个台阶;第三种为先上1个台阶,再上2个台阶。输入为n,输出为走到第n个台阶有几种走法 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • Input:比如输入是3

    Output:如果输入是3,走到第3个台阶的走法总计有3种,1,1,1 和  1,2 和2,1,输出为3

    #include <stdio.h>
    int method(int n)
    {
    	if (n == 1)
    	{
    		return 1;
    	}
    	if (n == 2)
    	{
    		return 2;
    	}
    	return method(n - 1) + method(n - 2);
    }
    int main()
    {
    	int n;
    	scanf("%d", &n);
    	int result=method(n);
    	printf("%d\n", result);
    }