Arrays OCaml-查找排序列表中缺失的最小数字
我一直在尝试在OCaml中实现一个函数,该函数返回排序列表中丢失的最小数字(大于0) 这就是我所做的Arrays OCaml-查找排序列表中缺失的最小数字,arrays,sorting,ocaml,Arrays,Sorting,Ocaml,我一直在尝试在OCaml中实现一个函数,该函数返回排序列表中丢失的最小数字(大于0) 这就是我所做的 let getMissingNumber l = let rec find min = function | [] -> min | t :: [] -> t + 1 | t1 :: t2 :: r -> if t2 - t1 > 1 then t1 + 1 else find min (t2 :: r)
let getMissingNumber l =
let rec find min = function
| [] -> min
| t :: [] -> t + 1
| t1 :: t2 :: r -> if t2 - t1 > 1 then t1 + 1 else find min (t2 :: r)
in find 1 l;;
结果如下:
# getMissingNumber [1; 4; 5];;
- : int = 2
# getMissingNumber [1; 2; 5];;
- : int = 3
# getMissingNumber [1; 2; 3];;
- : int = 4
# getMissingNumber [3; 4; 5];;
- : int = 6
除了最后一个,所有的结果都是正确的。有什么建议吗?问题是,如果列表包含多个元素,此函数将永远不会返回1,因为
|t::[]->t+1
(如果t>0
)
因此,我们可以将|t:[]->t+1
替换为|t:[]->min
,但在这种情况下,表单[1;2;3;…;n]
的所有列表都会出现问题,因为在|t1::t2::r
分支中,我们不会更改min
,因此我们最终会返回1(即使正确的响应是n+1
)
所以我们需要“更新”min
,但有趣的是,如果我们将find min(t2::r)
替换为find(t2+1)(t2::r)
,我们将返回到原始函数
事实上,此函数搜索大于最小显示数的最小缺失数。主要问题是您无正当理由区分[t]
和t1::t2::r
let getMissingNumber l =
let rec find min = function
| [] -> min
| t::r ->
if t > min then min
else find (t + 1) r
in find 1 l
如果输入列表可能以小于1的值开始,则还需要跳过这些值
let getMissingNumber l =
let rec find min = function
| [] -> min
| h :: t when min < t -> min
| h :: t when min = t -> find (min+1) t
| _ :: t -> find min t
in find 1 l
让getMissingNumber l=
让rec查找min=函数
|[]->min
|当最小值min时,h::t
|h::t当min=t时->查找(min+1)t
|_u3;::t->查找最小t
在查找1 l中
当您有一个单例t:[]
(或[t]
)时,您不需要比较检查值是否大于min
。检查所有元素是否按顺序排列,如果是这种情况(如您的最后一个示例),请返回第一个元素减去1…但是否可以在您的函数中实现它-我不知道;)最后的结果真的错了吗?6是最小的正整数,它既大于输入列表的最小元素(aka 3),也不是列表的一部分。正如@octachron指出的,最后两个结果是相似的。也许返回0
或None
更有意义,因为在排序的序列中实际上没有丢失任何数字。