Есть ли «именованный» алгоритм для разделения массивов по размерам сегментов - PullRequest
0 голосов
/ 26 июня 2018

Я хотел бы взять входной массив и набор возможных размеров и разбить массив на подмассивы, каждый из которых имеет счетчик максимально возможного размера сегмента, который меньше оставшегося числа элементов.

Итак, входной массив ...

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]

А размеры ...

[10, 5, 3, 2, 1]

Будет возвращен массив как ...

[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [11, 12, 13], [14]]

Сначала делим 10, потом 3, а потом 1.

Я могу сделать это очень неуклюже, используя циклы while и т. Д., Но мне было интересно, есть ли у такого рода алгоритма имя какого-нибудь рода, которое я мог бы исследовать, более изящные способы сделать это.

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Вы можете достичь этого и в одном цикле. Примерно так выглядит JS:

var inputArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14];
var sizeArray = [10, 3, 5, 2, 1];
var outputArray = [];

sizeArray.sort(function(a, b) { return b-a}); // Sort array in decreasing order

while(sizeArray.length > 0 && inputArray.length > 0){
  var m = sizeArray[0];
  sizeArray = sizeArray.slice(1); // Pop the first element from Size Array
  if(m <= inputArray.length){
    outputArray.push(inputArray.slice(0, m)); // Extract first m elements from inputArray if its size is greater than m
    inputArray = inputArray.slice(m);
  }
}
console.log(outputArray);
0 голосов
/ 26 июня 2018

Благодаря @AnandUndavia я решил это не как упражнение по разбиению массива, а как проблему с изменением монет.

Мне удалось решить эту проблему с помощью этой функции ... (In Swift)

func separate(numberOfItems n: Int, bucketSizes sizes: [Int]) -> [Int] {
    var output = [Int]()
    var remaining = n

    for size in sizes {
        while remaining >= size {
            output.append(size)
            remaining -= size
        }
    }

    return output
}

Теперь с моим массивом размеров я могу легко решить остальную часть проблемы, над которой я работал: D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...