【问题标题】:Concatenate two arrays by their lowest and highest values按最小值和最大值连接两个数组
【发布时间】:2016-12-22 20:21:01
【问题描述】:

我需要连接两个数组

let array1 = [2,10,3,11]
let array2 = [10,1,5,8]

结果数组应该是第一个数组中的最大值和第二个数组中的最小值的总和,就像这样 array1 中的第一个最大值:11,第二个中的最小值:1。然后我们从第一个和第二个中删除两个数字,依此类推。按此顺序:

  1. 11 + 1
  2. 10 + 5
  3. 3 + 8
  4. 2 + 10

结果 - [12, 15, 11, 12]

我知道如何通过创建临时数组来做到这一点,但想知道是否有任何方法可以通过使用 map, enumerate 等函数来做到这一点。谢谢。

【问题讨论】:

  • 您的意思是第一个数组中的 highest 值和第二个数组中的 lowest 值的总和,对吧?第 1 步也应该是 11 + 1,而不是 1 + 1。

标签: arrays swift


【解决方案1】:

对数组进行排序(按降序和升序),压缩它们,然后添加:

let array1 = [2,10,3,11]
let array2 = [10,1,5,8]

let result = zip(array1.sorted(by: >), array2.sorted()).map(+)
print(result) // [12, 15, 11, 12]

zip() 从两个(排序的)数组中返回一个对序列。 然后将map() 应用到这个序列上得到一个数组 总和。

对数组进行一次排序比重复定位要快 并删除最大(或最小)的元素。

【讨论】:

  • 一种类似但在语义上略有不同的方法是使用默认的< 运算符作为对两个数组进行排序的谓词,但将reversed() 应用于前者,即let result = zip(array1.sorted().reversed(), array2.sorted()).map(+)。我相信使用反向顺序视图应该没有额外的开销。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 2017-02-13
  • 2012-02-11
  • 2018-10-30
  • 2023-03-20
相关资源
最近更新 更多