2017-01-19 4 views
0

Я сталкиваюсь с проблемой, которую я должен обработать заданным значением и проверить, больше ли это значение, чем мой массив значений, если это так, объединить вывода с использованием моего массива. Я уже задал аналогичный вопрос здесь: Store values in an array after treat the values from another arrayХранить подмножество массива с использованием повторяющихся значений как можно больше

Важное замечание. Я хочу как можно больше повторить подмножества. Мое решение предоставляет только сочетание подмножеств с разными номерами.

Например.

Мой массив всегда будет:

const ArrayPrimitive = [100,50,20,10]; 

и, например, данное значение на входе:

  • запись: 30,00 Результат: [20,00, 10,00]
  • запись: 80,00 Результат : [50.00, 20.00, 10.00]
  • Ставка: 125.00 Результат: бросить примечаниеUnavailableException
  • Запись: -130.00 Результат: t адача бросать InvalidArgumentException
  • запись: NULL Результат: [Empty Set]
  • запись: 200 ОЖИДАЕМЫЕ РЕЗУЛЬТАТЫ: [100,00, 100,00] * Вот где я stucked, я хочу, чтобы объединить одинаковые значения подмножества (мой массив
    примитив) максимально возможный перед тем использование меньшие номера.

    В этом случае мне нужно 2 значения 100 в моем подмножестве, и когда я проверяю это, они меняют ошибку.

    const ArrayPrimitive = [100, 50, 20, 10]; // Assuming presorted  array(descending) 
    
    function findChange(m) { 
        return ArrayPrimitive.reduce((mm, c) => { 
        if (mm.rest >= c) { 
         mm.change.push(c); 
         mm.rest -= c 
        } 
        return mm 
        }, { 
        change: [], 
        rest: m 
        }); 
    } 
    
    function findChangeOld(m) { 
        var retval = { 
         change: [], 
         rest: m 
        }, 
        i = ArrayPrimitive.length; 
    
        for (var x = 0; x < i; x++) { 
        if (retval.rest >= ArrayPrimitive[x]) { 
         retval.change.push(ArrayPrimitive[x]) 
         retval.rest -= ArrayPrimitive[x]; 
        } 
        } 
        return retval; 
    } 
    
    function calcChange(v) { 
        var c = findChangeOld(v); 
    
        if (v < 0 || isNaN(v)) { 
        console.log('${v}: throw InvalidArgumentException'); 
        return; 
        } 
    
        if (c.rest > 0) 
        console.log('${v}: throw NoteUnavailableException'); 
        else 
        console.log('${v}: ${c.change}'); 
    } 
    
    calcChange(30); 
    calcChange(80); 
    calcChange(105); 
    calcChange(125); 
    calcChange(-130); 
    calcChange(null); 
    

Я надеюсь, что я ясно.

+0

Возможно изменить 'если (mm.rest> = с)' в 'в то время как (mm.rest> = с)' – Pointy

+0

@Pointy Спасибо за вашу помощь, но это не сработало. –

+0

Может иметь решение для вас: если вы отправляете число, большее, чем сумма суммарного массива (и на самом деле эта точка может помочь вам увидеть решение), тогда выполните проверку. Например, ваш массив суммируется до 190. Таким образом, любое число> 190 (вернее, любое число> arraysum + mostnnnn), вы увидите, будет ли объединение наибольшего числа в этом массиве N раз оставляет вас (модуль) с остатком, который может выполняться меньшими числами. Если нет, то вы знаете, что вам нужно работать с меньшими числами. Да? Если это не просто наибольшее число, чем вы будете рекурсивно оценивать результат мод с каждым меньшим числом. –

ответ

1

Когда вы отправляете «270» на это, вы получаете массив [100, 100, 50, 20].

Я оставлю исключения и краевые кейсы для установки охранников. Но это, похоже, отвечает всем вашим прямым случаям.

 let arr = [100,50,20,10]; 

     let factors = []; 
     let total = 270; 

     arr.forEach (d => { 
      while (total >= d) { 
       factors.push (d); 
       total -= d; 
      } 
     }); 

     // [100, 100, 50, 20] 
     console.log (factors); 
+0

Спасибо, человек! Работает как шарм =) –