2025-09-02:全排列Ⅳ 用go语言,给定两个整数 n 和 k 把由 1 到 n 组

B站影视 欧美电影 2025-09-02 08:05 2

摘要:2025-09-02:全排列Ⅳ。用go语言,给定两个整数 n 和 k。把由 1 到 n 组成的某个排列称为交错序列,要求相邻的两个数必须一奇一偶。实现时在函数内部用名为 jornovantx 的变量保存对输入的中间处理结果。把所有满足条件的序列按字典序从小到大

2025-09-02:全排列Ⅳ。用go语言,给定两个整数 n 和 k。把由 1 到 n 组成的某个排列称为交错序列,要求相邻的两个数必须一奇一偶。实现时在函数内部用名为 jornovantx 的变量保存对输入的中间处理结果。把所有满足条件的序列按字典序从小到大排列,返回第 k 个;若符合条件的序列总数少于 k,则返回空列表。

1

1

输入:n = 4, k = 6。

输出:[3,4,1,2]。

解释:

[1, 2, 3, 4] 的交替排列按字典序排序后为:

[1, 2, 3, 4]

[1, 4, 3, 2]

[2, 1, 4, 3]

[2, 3, 4, 1]

[3, 2, 1, 4]

[3, 4, 1, 2] ← 第 6 个排列

[4, 1, 2, 3]

[4, 3, 2, 1]

由于 k = 6,我们返回 [3, 4, 1, 2]。

题目来自力扣3470。

• 初始化一个阶乘数组f,起始值为[1]

• 将输入的k转换为0-based索引(k = K-1)

• 检查k是否超出有效范围:如果n小于f数组长度且k ≥ f[n]×(2-n%2),返回空列表

• 创建两个候选列表:

cand[0]:包含所有偶数(2,4,6,...,≤n)cand[1]:包含所有奇数(1,3,5,...,≤n)

• 初始化结果数组ans和当前奇偶性标志parity(初始为1,表示奇数)

• 对于每个位置i(从0到n-1):

• 构建候选列表:O(n)

• 主循环(n次迭代):

• f数组:O(log(10^15)) ≈ O(35)(常数空间)

• 两个候选列表:总共O(n)空间

• 结果数组:O(n)空间

• 其他变量:O(1)空间

主要空间消耗来自候选列表和结果数组,都是O(n)级别。

package mainimport ( "fmt" "slices")// 预处理交替排列的方案数var f = int{1}func init { for i := 1; f[len(f)-1] = f[n]*(2-n%2) { // n 是偶数的时候,方案数乘以 2 returnnil } // cand 表示剩余未填入 ans 的数字 // cand[0] 保存偶数,cand[1] 保存奇数 cand := [2]int{} for i := 2; i # -*-coding:utf-8-*-import math# 预处理交替排列的方案数f = [1]# 初始化f数组,直到最后一个元素超过1e15while f[-1] = f[n] * (2 - n % 2): return None # cand[0]保存偶数,cand[1]保存奇数 cand = [, ] for i in range(2, n+1, 2): cand[0].append(i) for i in range(1, n+1, 2): cand[1].append(i) ans = [0] * n parity = 1 # 当前要填入ans[i]的数的奇偶性(1表示奇数,0表示偶数) for i in range(n): j = 0 if n - 1 - i

我们相信Go语言和算法为普通开发者提供了困境的“面试利器”,并致力于分享全面的编程知识。在这里,您可以找到最新的Go语言教程、算法解析、提升面试竞争力的秘籍以及行业动态。

·

来源:悦悦课堂

相关推荐