繁体   English   中英

减少数组到第一个和最后一个元素的元组?

[英]Reduce array to tuple of first and last element?

我有一个要先排序的数组,然后返回已排序数组的第一个和最后一个元素。 我以为可以使用reduce ,但是如果没有初始值怎么办?

这是我要使用的数组:

let myNumbers = [4, 9, 6, 2, 3]

如何将其map到排序数组的第一个和最后一个?

(2, 9)

方法1: min() / max()

这是最简单的方法:

let input = [4, 9, 6, 2, 3]
let output = (input.min(), input.max())
print(output) //(Optional(2), Optional(9))

如果确定数组不为空,则可以安全地强制展开可选对象:

let input = [4, 9, 6, 2, 3]
let output = (input.min()!, input.max()!) // (2, 9)

这是对数组进行2次迭代的方法。 O(N) 除非在其他地方需要排序列表,否则排序的结果将是O(N * log_2(N)) ,然后进行第一个/最后一个排序会更糟。

方法2: reduce()

如果您坚持使用reduce,可以这样做:

let input = [4, 9, 6, 2, 3]
let output = input.reduce((min: Int.max, max: Int.min)){
    (min($0.min, $1), max($0.max , $1))
} //(2, 9)

每次减少迭代都会将累加器设置为新的最小值(旧的最小值和当前元素中的较小者)和新的最大值(旧的最大值和当前元素中的较大者)。

累加器的初始值设置为:

  • 数组中的任何元素相比小于累加器的最小值
  • 数组中任何元素的比较都大于累加器的最大值

您不需要reduce的initialValue,它是可选的。

var foo = [1, 40, 20, -20, 50];
var reducer = function(prev, curr, i, arr){return [prev[0] <= curr ? prev[0] : curr, prev[1] >= curr ? prev[1] : curr]};
var baz = foo.reduce(reducer); // [-20, 50]

或者像这样:

var foo = [1, 40, 20, -20, 50];
var reducer = function(prev, curr, i, arr){return {min: prev.min <= curr ? prev.min : curr, max: prev.max >= curr ? prev.max : curr}};
var baz = foo.reduce(reducer); // {min: -20, max: 50}

编辑:刚注意到这是为了快速而不是javascript,哎呀。 我一定在浏览错误的SO类别。 我认为原理很快就会相同,只是您可能确实需要提供某种初始值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM