Привет, Роб. Сначала жаль слышать о изобилии консоли 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. Сообщите мне, что вы думаете об этом подходе, и если у вас есть какие-либо вопросы или предложения относительно решения
Вот ссылка на репо с полным кодом:
Ваше здоровье :)