Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 08.07.2017, 11:51
Аватар для DynkanMaclaud
Профессор
Отправить личное сообщение для DynkanMaclaud Посмотреть профиль Найти все сообщения от DynkanMaclaud
 
Регистрация: 08.08.2014
Сообщений: 261

Требуется code review
Задача: Массив [2, 5, 9, 11, 1, 2, 4]
X = 12
Найти подмассив, сумма элементов которого больше X, а количество элементов минимально возможное

Решение:
const find = (target, data, resultMas = [], sum = 0) => {
 	// случай если сумма чисел меньше target
	if (!data.length) {
    	    console.error('max value:!', sum);
            return
        }
	const maxNum = Math.max.apply(Math, data);
        const index = data.indexOf(maxNum);
    
        resultMas.push(maxNum);
        sum = resultMas.reduce((prev, next) => prev + next);
    
        const test = sum > target;
        if (test) {
    	    return resultMas
        } else {
            data.splice(index, 1);
            return find(target, data, resultMas, sum);
        }
};

пример
Решение громоздкое, если есть варианты отпишите

Последний раз редактировалось DynkanMaclaud, 08.07.2017 в 11:53.
Ответить с цитированием
  #2 (permalink)  
Старый 08.07.2017, 12:26
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

DynkanMaclaud,
<script>
function fn(a, b) {
    a = a.slice(0).sort(function(a, b) {
        return b - a
    }).filter(function(a) {
        var c = 0 < b;
        b -= a;
        return 0 < c
    });
    return 0 < b ? !1 : a
};
document.write(JSON.stringify(fn([2, 5, 9, 11, 1, 2, 4],12)));

</script>
Ответить с цитированием
  #3 (permalink)  
Старый 08.07.2017, 17:31
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

var arr = [2, 5, 9, 11, 1, 2, 4], x = 12;
arr.sort((a, b)=> b-a).reduce((sum, el, i) => { 
	if (sum > x) arr.length = i;
	if (sum < x && i==arr.length-1) arr = false; // если все же X больше
	return sum + el;
});
alert(arr);

Последний раз редактировалось j0hnik, 08.07.2017 в 18:37.
Ответить с цитированием
  #4 (permalink)  
Старый 08.07.2017, 17:48
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

Сообщение от j0hnik
reverse()
Ответить с цитированием
  #5 (permalink)  
Старый 08.07.2017, 17:54
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

рони, опишите подробней ваши сомнения
Ответить с цитированием
  #6 (permalink)  
Старый 08.07.2017, 18:00
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

j0hnik,
зачем лишнее reverse? может подумать и сделать без него?
Ответить с цитированием
  #7 (permalink)  
Старый 08.07.2017, 18:31
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

Сообщение от j0hnik Посмотреть сообщение
var arr = [2, 5, 9, 11, 1, 2, 4], x = 12;
arr.sort((a, b)=> b-a).reduce((sum, el, i) => { 
	if (sum > x) arr.length = i;
	if (sum < x && i==arr.length-1) arr = false; // если все же X больше
	return sum + el;
});
alert(arr);
Рони спасибо, поправил
Ответить с цитированием
  #8 (permalink)  
Старый 08.07.2017, 18:32
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

j0hnik,
Ответить с цитированием
  #9 (permalink)  
Старый 09.07.2017, 09:51
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

минимальный подмассив с максимальной суммой больше определённого числа

<script>
function fn(a, c) {
    a = a.slice(0).sort(function(a, b) {
        return b - a
    });
    for (var b = 0; b < a.length; b++) {
        if (c < a[b]) return a.slice(0, ++b);
        c -= a[b]
    }
    return !1
};
document.write(JSON.stringify(fn([2, 5, 9, 11, 1, 2, 4],12)));

</script>

Последний раз редактировалось рони, 09.07.2017 в 09:56.
Ответить с цитированием
  #10 (permalink)  
Старый 13.07.2017, 00:08
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

var arr = [2, 5, 9, 11, 1, 2, 4], x = 12, sum = 0;
arr.length = arr.sort((a, b)=> b-a).findIndex((el) => (sum += el) > x )+1;
if(!arr.length) arr = false;
alert(arr);

Листал справочник. вспомнил эту тему =)

Последний раз редактировалось j0hnik, 13.07.2017 в 01:35.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Code review jQuery плагина PMaster Ваши сайты и скрипты 2 28.08.2016 12:41
Подскажите как лучше положить .xml документ в базу Гробовщик Серверные языки и технологии 4 02.09.2013 11:15
Функция парсинга строки в массив байт. B~Vladi Ваши сайты и скрипты 50 28.12.2011 16:16
прошу code review retif Prototype & script.aculo.us 3 29.07.2010 17:21
глюк форума Gvozd Сайт Javascript.ru 11 18.03.2009 14:37