2016-12-22 3 views
2

Мне нужно объединить два массиваОбъединить два массива по их самым низким и высоким значениям

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

результата массива должна быть суммой наибольшего значения в первом массиве и самый низкий во втором, как так первого по величине стоимости из массива 1: 11 и самый низкий из второго: 1. Затем мы удаляем оба числа из первого и второго и так далее. В этом порядке:

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

Результат - [12, 15, 11, 12]

Я знаю, как это сделать, создавая временные массивы, но хотел бы знать, есть ли способ сделать это, используя такие функции, как map, enumerate и так далее. Спасибо.

+0

Вы имеете в виду сумму * наивысшего * значения в первом массиве и * наименьшее * во втором, не так ли? Также шаг 1 должен быть 11 + 1, а не 1 + 1. – Hamish

ответ

9

Сортировка массивы (. В уменьшении соотв порядке возрастания), застежка-молния их, и добавить:

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(), чтобы получить массив сумм .

Сортировка массивов один раз быстрее, чем повторное обнаружение и удаление самого большого (соответствующего наименьшего) элемента.

+0

очень приятно! Сегодня я узнал: zip – daltonclaybrook

+2

спасибо за быстрый ответ! –

+1

Аналогичным, но семантически немного отличающимся подходом было бы использовать по умолчанию '' 'operator в качестве предиката для сортировки обоих массивов, а применить« reverse() »к первому, то есть« let result = zip (array1.sorted() .reversed(), array2.sorted()). map (+) '. Я полагаю, что не должно быть дополнительных накладных расходов, используя обратный порядок. – dfri

Смежные вопросы