Подборка объединяет вопросы, отмеченные на этапах интервью в Яндекс. Здесь можно понять структуру технической проверки и заранее повторить связанные темы. В подборке чаще встречаются темы: mobile, backend, database.
Слейте координаты двумя указателями и храните последние значения обеих функций. В каждой общей координате сначала обновите обе ступени, затем добавьте их сумму один раз.
Разница длин не должна превышать единицу. На первом несовпадении пропускайте один символ в длинной строке либо в обеих равных по длине; второе несовпадение означает false.
Поддерживайте окно без повторов и последнюю позицию каждой буквы. Для правого конца right существует right - left + 1 подходящих подстрок; суммируйте эти количества.
Проверяйте каждый номинал по разрешённому набору выбранной валюты, а количество — на неотрицательность. Map<Integer, Integer> сама по себе не ограничивает допустимые значения.
Две отдельные Map приводят к дублированию логики и ветвлениям по валюте. Лучше единая структура Currency → номинал → количество с общими операциями выдачи и пополнения.
withdraw должен отклонять нулевую и отрицательную сумму до расчёта купюр и изменения остатков. Также проверяют поддерживаемую валюту, допустимые единицы суммы и возможность точной выдачи.
После успешного расчёта выдачи количество каждой выбранной купюры должно уменьшиться на выданное число. Если финальное выражение использует merge с Integer::sum и положительным count, оно ошибочно увеличивает запас.
Для заданных номиналов можно идти от крупных купюр к мелким, сначала рассчитать выдачу, а затем списать остатки. Операция должна быть атомарной, валюты — храниться раздельно.
В показанном фрагменте выдача увеличивает остатки через Integer::sum, хотя должна уменьшать их. Расчёт набора купюр и его списание необходимо выполнять атомарно; код также содержит необъявленные переменные.
Используйте разные конфигурации AnalyticsClient: для первого экрана — console sink, для второго — console и file sink. Запись файла сериализуйте общей очередью.