Привет, Роб. Сначала жаль слышать о изобилии консоли google chrome :) В следующий раз вы можете использовать вкладку «Источники» и добавить новый фрагмент кода. Это позволяет вам не нажимать «Shift + Enter» на каждой новой строке, и вы можете использовать cmd или ctrl + enter для запуска вашей программы.

Во-вторых, я добавил образец набора из 1000 монет в качестве тестовых данных. Вы можете найти набор здесь [https://gist.github.com/adyngom/214f6da295cda0c17f107b94951070a8]

Теперь что касается решения, это будет отличный первый набросок и, возможно, все, что вам понадобится в зависимости от стадии собеседования. Я лично использовал то, что я называю «словарным» маршрутом, который, по сути, использует объект, который имеет пары ключ-значение номинала монеты и их общего количества. Я создаю этот объект динамически, поэтому, если номинал не является частью банки, ключ никогда не создается.

Я использую конструкцию ниже, чтобы сделать это

const coinJar = [....]; // import your coins data here
const coinsCount = coinJar.reduce( groupBy, {} );
function groupBy(bag, coins) {    
    !!bag[coins] ? (bag[coins] += 1) : (bag[coins] = 1);    
    return {...bag };
}

После выхода из CoinsCount вы получите объект ниже

{ '1': 254, '5': 269, '10': 250, '25': 227 }

Затем я использовал вспомогательную функцию getQuotientRemainder

function getQuotientRemainder(x, y) {
  if (!y) {
    throw new Error('we need an x value and a y value');
  }
  return { quotient: parseInt(x / y), remainder: x % y };
}

Наконец, я использую метод Object.keys, чтобы получить массив ключейcoinCount и применить операцию к каждой сумме.

Object.keys(coinsCount).map(key => {
  // logic here
});

Строка 14 встроенной сущности ниже показывает основную часть логики. Я очистил код здесь и организовал вспомогательные функции в папку Utils. Сообщите мне, что вы думаете об этом подходе, и если у вас есть какие-либо вопросы или предложения относительно решения

Вот ссылка на репо с полным кодом:



Ваше здоровье :)