请求编写函数:寻找未排序数组中缺失的最小正整数
找出列表中不存在的最小正整数(KDB/Q实现)
需求说明
给定包含正负整数的列表,找出其中缺失的最小正整数,示例如下:
- 输入
2 9 -10 5 3 1 11 -1 7→ 输出4 - 输入
-10 4 -4 2 15 13 6 8 -1→ 输出1 - 输入
1 1 0 18 1 -12 -6 18 21→ 输出2
完整实现函数
基于你已有的正整数筛选逻辑,补充后续连续值判断逻辑,最终函数如下:
minMissingPositive:{ // 筛选正整数、去重并排序 pos:asc distinct where[;x>0]x; // 无正整数时直接返回1 if[0=count pos; :1]; // 对比排序后的正整数与从1开始的连续序列,找到第一个不匹配的位置 diff:where pos <> 1+til count pos; // 根据对比结果返回缺失值:无缺失则返回序列长度+1,否则返回第一个缺失的数 $[0=count diff; count pos +1; 1+first diff] }
测试验证
将示例输入代入函数验证结果:
q)list: 2 9 -10 5 3 1 11 -1 7 q)minMissingPositive list 4 q)list2: -10 4 -4 2 15 13 6 8 -1 q)minMissingPositive list2 1 q)list3: 1 1 0 18 1 -12 -6 18 21 q)minMissingPositive list3 2
逻辑拆解
- 正整数筛选与预处理:
asc distinct where[;x>0]x先过滤掉非正整数,去重后排序,避免重复元素干扰连续值判断 - 边界情况处理:如果列表中没有任何正整数,最小缺失正整数必然是1(如示例list2)
- 连续值对比:生成从1开始的连续整数序列(长度与筛选后的正整数列表一致),和排序后的正整数列表逐位比对,找到第一个不匹配的位置
- 结果判定:若所有位置都匹配(说明1到
count pos的正整数都存在),则返回count pos +1;否则返回第一个不匹配位置对应的连续数,即缺失的最小正整数
内容的提问来源于stack exchange,提问作者Rajasekhar
相关产品推荐
相关产品推荐

