幼儿网站模板开网店需要什么条件和哪些手续?
2026/6/20 10:32:00 网站建设 项目流程
幼儿网站模板,开网店需要什么条件和哪些手续?,理财p2p网站开发,福田庆三整鼻子好吗(新卷,100分)- 第k个排列#xff08;Java JS Python#xff09; 题目描述 给定参数n#xff0c;从1到n会有n个整数#xff1a;1,2,3,…,n,这n个数字共有n!种排列。 按大小顺序升序列出所有排列的情况#xff0c;并一一标记#xff0c; 当n3时,所有排列如…(新卷,100分)- 第k个排列Java JS Python题目描述给定参数n从1到n会有n个整数1,2,3,…,n,这n个数字共有n!种排列。按大小顺序升序列出所有排列的情况并一一标记当n3时,所有排列如下:“123” “132” “213” “231” “312” “321”给定n和k返回第k个排列。输入描述输入两行第一行为n第二行为k给定n的范围是[1,9],给定k的范围是[1,n!]。输出描述输出排在第k位置的数字。用例输入33输出213说明3的排列有123,132,213…,那么第三位置就是213输入22输出21说明2的排列有12,21那么第二位置的为21。题目解析通过上面n3的全排列可以分析以1开头、以2开头、以3开头的排列个数各有两个因为固定开头为1的则其排列情况就是n2的排列情况即有两个23、32。因此以1开头的排列个数有 2!个以23开头的排列个数求解同理。因此我们要求n3的第k个排列完全可以推断出第k个排列的开头数字是几。比如n3的第1个和第2个排列的开头数字prefix就是1第3、4个排列的开头数字prefix就是2第5、6个排列的开头数字prefix就是3。推导一下可得公式Math.ceil(k / (n-1)!)但是这里我不想根据k、n来直接推导出排列的开头数字prefix因为这个逻辑不适用于后面的递归我们会将组成排列的数字按大小升序存入一个数组 arr中比如n3的排列元素为 arr [1,2,3]此时我们要求n3的第k个排列的开头数字公式为arr [ Math.floor((k-1) / (n-1)!) ]知道了第k个排列的开头数字prefix后我们就可以缩小排列的查找范围比如n3k3的排列查找就可以在以下范围中查找213231而此时k3值就不适用了因为k3是相对于下面情况的123132213231312321我们需要将k值转换为1转换公式如下newK k % (n-1)!但是这个公式不普适比如n3,k4时经过上面公式转换newK就变为0而实际上newK应该为2,因此我们需要附加判断newK 0 ? (n-1)! : newK此时就完成了大问题n3, k3, arr[1,2,3]的简化简化为了n2, k1 ,arr[1,3] 且 prefix2因此我们可以使用递归来解决此题而当k1时表示当前arr[1,3]的排列就是需要的排列因此最终要找的排列就是 prefix arr.join() 213。因此 k 1就是递归的出口条件。Java算法源码import java.util.Arrays; import java.util.Scanner; public class Main { static int[] fact; public static void main(String[] args) { Scanner sc new Scanner(System.in); int n sc.nextInt(); int k sc.nextInt(); fact new int[n 1]; fact[1] 1; for (int i 2; i n; i) { fact[i] fact[i - 1] * i; } int[] arr new int[n]; for (int i 0; i n; i) arr[i] i 1; System.out.println(getNK(n, k, arr)); } public static String getNK(int n, int k, int[] arr) { if (n 1) return 1; int f fact[n - 1]; int prefix arr[(k - 1) / f]; k % f; k k 0 ? f : k; arr Arrays.stream(arr).filter(ele - ele ! prefix).toArray(); if (k 1) { StringBuilder sb new StringBuilder(); for (int v : arr) sb.append(v); return prefix sb.toString(); } else { return prefix getNK(n - 1, k, arr); } } }JS算法源码/* JavaScript Node ACM模式 控制台输入获取 */ const readline require(readline); const rl readline.createInterface({ input: process.stdin, output: process.stdout, }); const lines []; let factorial [0, 1]; rl.on(line, (line) { lines.push(line); if (lines.length 2) { let [n, k] lines.map((ele) parseInt(ele)); for (let i 2; i n; i) { factorial[i] factorial[i - 1] * i; } let arr new Array(n).fill(0).map((_, index) index 1); console.log(getNK(n, k, arr)); lines.length 0; } }); /* 算法 */ function getNK(n, k, arr) { if (n 1) { return 1; } let f factorial[n - 1]; let prefix arr[Math.floor((k - 1) / f)]; k k % f; k k 0 ? f : k; arr arr.filter((ele) ele ! prefix); if (k 1) { return prefix arr.join(); } else { return prefix getNK(n - 1, k, arr); } }Python算法源码# 输入获取 n int(input()) k int(input()) arr [i 1 for i in range(n)] fact [0] * (n 1) fact[1] 1 for i in range(2, n 1): fact[i] fact[i - 1] * i # 算法入口 def getResult(n, k, arr): if n 1: return 1 f fact[n - 1] prefix arr[(k - 1) // f] k % f k f if k 0 else k arr list(filter(lambda x: x ! prefix, arr)) if k 1: return str(prefix) .join(map(str, arr)) else: return str(prefix) getResult(n - 1, k, arr) # 算法调用 print(getResult(n, k, arr))解法二不用递归Java算法源码import java.util.Arrays; import java.util.Scanner; public class Main { static int[] fact; public static void main(String[] args) { Scanner sc new Scanner(System.in); int n sc.nextInt(); int k sc.nextInt(); fact new int[n 1]; fact[1] 1; for (int i 2; i n; i) { fact[i] fact[i - 1] * i; } int[] arr new int[n]; for (int i 0; i n; i) arr[i] i 1; System.out.println(getResult(n, k, arr)); } public static String getResult(int n, int k, int[] arr) { if (n 1) return 1; StringBuilder sb new StringBuilder(); while (true) { int f fact[n - 1]; int prefix arr[(k - 1) / f]; sb.append(prefix); k k % f; if (k 0) k f; arr Arrays.stream(arr).filter(ele - ele ! prefix).toArray(); n--; if (k 1) { for (int v : arr) sb.append(v); break; } } return sb.toString(); } }JS算法源码/* JavaScript Node ACM模式 控制台输入获取 */ const readline require(readline); const rl readline.createInterface({ input: process.stdin, output: process.stdout, }); const lines []; rl.on(line, (line) { lines.push(line); if (lines.length 2) { let [n, k] lines.map((ele) parseInt(ele)); console.log(getPermutation(n, k)); lines.length 0; } }); function getPermutation(n, k) { if (n 1) return 1; // 记录n!排列组合需要的成员 let arr new Array(n).fill(0).map((_, idx) idx 1); // 记录阶乘值 let factorial [0, 1]; for (let i 2; i n; i) { factorial[i] factorial[i - 1] * i; } let res ; while (true) { // 第k个排列的开头数字prefix let prefix arr[Math.floor((k - 1) / factorial[n - 1])]; res prefix; // 对应排列在开头为prefix的排列中的序号 k k % factorial[n - 1]; if (k 0) { k factorial[n - 1]; } // 开头为prefix的排列所需的成员 arr arr.filter((ele) ele ! prefix); n--; if (k 1) { res arr.join(); break; } } return res; }Python算法源码# 输入获取 n int(input()) k int(input()) arr [i 1 for i in range(n)] fact [0] * (n 1) fact[1] 1 for i in range(2, n 1): fact[i] fact[i - 1] * i # 算法入口 def getResult(n, k, arr): if n 1: return 1 res [] while True: prefix arr[(k - 1) // fact[n-1]] res.append(str(prefix)) k k % fact[n-1] if k 0: k fact[n-1] arr list(filter(lambda x: x ! prefix, arr)) n - 1 if k 1: res.append(.join(map(str, arr))) break return .join(res) # 算法调用 print(getResult(n, k, arr))

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询