给定参数 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和整个排列组合集合之间的关系,用较少的计算得到需要的结果。
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);
}