【问题标题】:how to find smallest number in a list如何在列表中找到最小的数字
【发布时间】:2020-04-09 07:20:27
【问题描述】:

如果我有一个整数列表,我该如何编写一个函数来确定列表中数字之间的最小正差?一个例子可以是:

[1; 3; 5; 6] // difference 1 (between 6 and 5)

【问题讨论】:

  • StackOverflow 不是代码编写服务。请尝试自己解决它,发布您的代码,并解释您遇到困难的地方,或者您需要帮助的特定方面。 ——也就是说,我发现这个问题很有趣,并设法使用库函数在大约 3 行代码中解决了它。如果你想要一个不使用库函数的解决方案,代码会稍微长一些。
  • 如果这是一个 C# 问题,我会同意你的观点,@dumetrulo,但对于 F#,它通常是关于在 List、Array、Option、Map 等模块中找到正确的函数。找到正确的函数通常不是微不足道的,因此即使对于有经验的 F# 开发人员来说,获得关于 SO 的答案也很有价值。在使用 F# 七年之后,我仍然没有使用过这些函数的一半,这主要是因为我猜缺乏示例。
  • @BentTranberg 我同意你对库函数的看法,你需要一段时间才能很好地了解存在哪些函数以及它们的作用。现在更难了,因为微软的文档似乎基本上是离线的。 — dackfunk 的问题:您想要后续列表项之间的差异,还是任意两个列表项之间的差异?后者会稍微复杂一些(即超过 3 行代码)。
  • @dumetrulo 任意两个列表项

标签: c# list visual-studio integer difference


【解决方案1】:

根据 cmets 中的讨论,我不会尝试编写完整的解决方案,但会提示您使其工作所需的功能。

如果您正在寻找后续数字之间的最小差异,那么您可以使用List.pairwise 函数,它会为您提供包含后续数字的元组列表。然后,您可以将其传递给 List.map 以将元组列表转换为差异列表(通过从另一个中减去一个)并传递给 List.min 以找到最小的。

> [1;3;5;6] |> List.pairwise;;
val it : (int * int) list = [(1, 3); (3, 5); (5, 6)]

如果您正在寻找任何两个数字之间的最小差异,那么我将首先使用 List.sort 对列表进行排序,然后执行与上述相同的操作 - 对列表进行排序将保证您需要减去的数字才能得到最小的差异将彼此相邻。

【讨论】:

  • tks 很多先生,“问题”是我不仅需要迭代后续数字,还需要迭代该列表中的所有数字。例如,如果我有 [1,2,3] 并且我在数字 2 的迭代中,我应该将它与 1 和 3 进行比较。
  • 不是真的:如果列表是排序的,你已经知道第一个和第三个元素之间的差异不能小于第一个和第二个元素之间的差异,所以你不需要做比较不再在第一个和第三个元素之间了。
【解决方案2】:

现在我将为您提供一个完整的解决方案,但它是通用的,因此它适用于满足comparison and member constraints 的任何类型,并且它也适用于实现IEnumerable<'T> 的任何集合类型。这会将您的工作从弄清楚要使用哪些功能转移到它们实际在做什么以及它们如何协同工作。

let inline smallestDiff source =
    source 
    |> Seq.sort
    |> Seq.pairwise
    |> Seq.groupBy (fun (x, y) -> y - x)
    |> Seq.minBy fst
// val inline smallestDiff :
//   source:seq< ^a> ->  ^b * seq< ^a *  ^a>
//     when  ^a : comparison and  ^a : (static member ( - ) :  ^a *  ^a ->  ^b) and
//           ^b : comparison

[1; 3; 5; 6] |> smallestDiff
// val it : int * seq<int * int> = (1, seq [(5, 6)])

【讨论】:

    猜你喜欢
    • 2020-09-04
    • 2017-03-09
    • 2020-11-28
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 2020-06-17
    相关资源
    最近更新 更多