Java · 33 строк
Метод считает кешбэк клиента за текущий месяц. Премиальным клиентам — повышенные ставки в категориях по MCC, в остальных категориях и всем прочим клиентам — 1 %. Кешбэк по каждой операции округляется вниз до копейки, возврат покупки вычитает её кешбэк.
getClientId() и getId() возвращают Long, getDate() — java.util.Date. Калькулятор вызывается из многих потоков. Код компилируется. Отметьте строки с ошибками.
В работе: Ежемесячное начисление кешбэка: миллионы клиентов, каждая копейка видна в приложении.
Как проверяем
Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Ответ один на подход: после него показываем разбор.
Источник: обзор транскриптов интервью: Альфа-Банк, код с неочевидными багами. Условие пересказано своими словами.
Давали на собеседовании?
Ответов пока мало — ваш поможет.
public class CashbackCalculator {private static final SimpleDateFormat MONTH = new SimpleDateFormat("yyyy-MM");private static final Map<String, BigDecimal> RATES = new HashMap<>();static {RATES.put("5411", new BigDecimal("0.05"));RATES.put("5812", new BigDecimal("0.10"));RATES.put("5541", new BigDecimal("0.03"));}public BigDecimal calculate(Client client, List<Transaction> txs) {BigDecimal total = BigDecimal.ZERO;for (Transaction tx : txs) {if (tx.getClientId() != client.getId()) {continue;}if (!MONTH.format(tx.getDate()).equals(client.getCurrentMonth())) {continue;}BigDecimal rate = client.isPremium() ? RATES.get(tx.getMcc()) : BigDecimal.ONE.divide(new BigDecimal(100));BigDecimal cashback = tx.getAmount().multiply(rate);if (tx.getStatus() == Status.REFUND) {total.subtract(cashback);} else {total = total.add(cashback);}}if (total.equals(BigDecimal.ZERO)) {return BigDecimal.ZERO;}return total.setScale(2, RoundingMode.HALF_UP).min(client.getCashbackLimit());}}