[英]Reduce array to tuple of first and last element?
我有一个要先排序的数组,然后返回已排序数组的第一个和最后一个元素。 我以为可以使用reduce
,但是如果没有初始值怎么办?
这是我要使用的数组:
let myNumbers = [4, 9, 6, 2, 3]
如何将其map
到排序数组的第一个和最后一个?
(2, 9)
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))
,然后进行第一个/最后一个排序会更糟。
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.