Last active
February 21, 2016 19:57
-
-
Save SerafimArts/915dc8509f9cd6b9b612 to your computer and use it in GitHub Desktop.
Яндекс: Задача на собеседование №3
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Это феерическое безумие и полный разрыв | |
* мозга, по-этому я откомментирую ключевые моменты. | |
* | |
* Алгоритм фактически в лоб, просто перебор | |
* всех элементов, мозги и так плавятся =)))) | |
* | |
* Пример: | |
* console.log(theMadness([1, 4, 6, 98, 3, 2, 7, 8, 90, 12, 8])); | |
* Возвращает массив комбинаций элементов, где каждый элемент бредставлен объектом | |
* {value: значение, index: индекс_массива} | |
* | |
* | |
* @param list Сам массив | |
* @param maxSize Требуемая сумма элементов(10) | |
* @param positive Присутствуют ли негативные числа | |
* @returns {Array} | |
*/ | |
function theMadness(list, maxSize, positive){ | |
maxSize = (maxSize >> 0) || 10; | |
var result = [], // Результат на выдачу | |
combination = [], // Текущая комбинация элеметов (в цикле проверяются) | |
listLength = (1 << list.length); // Количество возможных комбинаций (такая вольность ограничена | |
// 32к (int), можно в принципе Math.sqrt, но это быстрее)\ | |
var getSum = function(arr) { | |
for(var i=0, sum=0; i<arr.length; sum+=arr[i++].value); | |
return sum; | |
}; | |
for (var i=0; i<listLength; ++i){ | |
combination = []; | |
for (var j=0; j<list.length; ++j){ | |
if ((i & (1 << j))){ // Если индексы совпадают | |
// Свойство positive нужно только для этого отсечения ниже (вообще спорный вопрос, надо ли) | |
if (positive && getSum(combination) > maxSize) { break; } | |
// Остальные пушим | |
combination.push({value: list[j], index: j}); | |
} | |
} | |
// Запихиваем в результат нужные элементы | |
if (combination.length !== 0 && getSum(combination) == maxSize) { | |
result.push(combination); | |
} | |
} | |
return result; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment