From 512a5fff277b0272a04101790c1745402ae3b612 Mon Sep 17 00:00:00 2001 From: MuravAna Date: Sat, 14 Feb 2026 10:41:44 +0300 Subject: [PATCH 1/9] add lecture task 3 --- .../java/lectures/lecture3/tasks/atm/Atm.java | 92 ++++++++++++++++++- .../java/lectures/lecture3/tasks/atm/task.md | 20 ++-- .../java/hse/java/practice/task1/Edge.java | 2 +- 3 files changed, 104 insertions(+), 10 deletions(-) diff --git a/src/main/java/hse/java/lectures/lecture3/tasks/atm/Atm.java b/src/main/java/hse/java/lectures/lecture3/tasks/atm/Atm.java index 3fa91909..42e92874 100644 --- a/src/main/java/hse/java/lectures/lecture3/tasks/atm/Atm.java +++ b/src/main/java/hse/java/lectures/lecture3/tasks/atm/Atm.java @@ -24,6 +24,15 @@ private enum Denomination { int value() { return value; } + + static Denomination fromValue(int value) { + for (Denomination d : values()) { + if (d.value == value) { + return d; + } + } + throw new IllegalArgumentException("No denomination with value " + value); + } } private final Map banknotes = new EnumMap<>(Denomination.class); @@ -31,14 +40,91 @@ int value() { public Atm() { } - public void deposit(Map banknotes){} + public void deposit(Map deposit) { + if (deposit == null) { + throw new InvalidDepositException("bebebe"); + } + for (Map.Entry entry : deposit.entrySet()) { + Integer denomination_ = entry.getKey(); + if (denomination_ != 50 && denomination_ != 100 && denomination_ != 500 && denomination_ != 1000 && denomination_ != 5000) { + throw new InvalidDepositException("invalid denomination"); + } + Integer amount_ = entry.getValue(); + if (amount_ <= 0) { + throw new InvalidDepositException("invalid amount of banknotes"); + } + } + Map banknotes_ = new EnumMap<>(Denomination.class); + for (Map.Entry entry : deposit.entrySet()) { + Integer denomination_1 = entry.getKey(); + Integer amount_ = entry.getValue(); + Denomination denom = Denomination.fromValue(denomination_1); + banknotes_.put(denom, this.banknotes.getOrDefault(denom, 0) + amount_); + } + this.banknotes.putAll(banknotes_); + } public Map withdraw(int amount) { - return Map.of(); + if (amount <= 0) { + throw new InvalidAmountException( + "invalid amount" + ); + } + if (amount > getBalance()) { + throw new InsufficientFundsException( + "insufficient funds" + ); + } + int am_c = amount; + Map banknotes_to_withdraw = new HashMap<>(); + Map banknotes_ = new EnumMap<>(Denomination.class); + int cnt5000 = Integer.min(amount / 5000, banknotes.getOrDefault(Denomination.D5000, 0)); + amount -= 5000 * cnt5000; + int cnt1000 = Integer.min(amount / 1000, banknotes.getOrDefault(Denomination.D1000, 0)); + amount -= 1000 * cnt1000; + int cnt500 = Integer.min(amount / 500, banknotes.getOrDefault(Denomination.D500, 0)); + amount -= 500 * cnt500; + int cnt100 = Integer.min(amount / 100, banknotes.getOrDefault(Denomination.D100, 0)); + amount -= 100 * cnt100; + int cnt50 = Integer.min(amount / 50, banknotes.getOrDefault(Denomination.D50, 0)); + amount -= 50 * cnt50; + if (amount > 0) { + throw new CannotDispenseException("cannot dispense"); + } + amount = am_c; + + if (cnt5000 > 0) + banknotes_to_withdraw.put(5000, cnt5000); + if (cnt1000 > 0) + banknotes_to_withdraw.put(1000, cnt1000); + if (cnt500 > 0) + banknotes_to_withdraw.put(500, cnt500); + if (cnt100 > 0) + banknotes_to_withdraw.put(100, cnt100); + if (cnt50 > 0) + banknotes_to_withdraw.put(50, cnt50); + banknotes_.put(Denomination.D5000, this.banknotes.getOrDefault(Denomination.D5000, 0) - cnt5000); + + banknotes_.put(Denomination.D1000, this.banknotes.getOrDefault(Denomination.D1000, 0) - cnt1000); + + banknotes_.put(Denomination.D500, this.banknotes.getOrDefault(Denomination.D500, 0) - cnt500); + + banknotes_.put(Denomination.D100, this.banknotes.getOrDefault(Denomination.D100, 0) - cnt100); + + banknotes_.put(Denomination.D50, this.banknotes.getOrDefault(Denomination.D50, 0) - cnt50); + + this.banknotes.putAll(banknotes_); + return banknotes_to_withdraw; } public int getBalance() { - return 0; + int ans = 0; + ans += this.banknotes.getOrDefault(Denomination.D5000, 0) * 5000; + ans += this.banknotes.getOrDefault(Denomination.D1000, 0) * 1000; + ans += this.banknotes.getOrDefault(Denomination.D500, 0) * 500; + ans += this.banknotes.getOrDefault(Denomination.D100, 0) * 100; + ans += this.banknotes.getOrDefault(Denomination.D50, 0) * 50; + return ans; } } diff --git a/src/main/java/hse/java/lectures/lecture3/tasks/atm/task.md b/src/main/java/hse/java/lectures/lecture3/tasks/atm/task.md index 3845672e..6ccc5abe 100644 --- a/src/main/java/hse/java/lectures/lecture3/tasks/atm/task.md +++ b/src/main/java/hse/java/lectures/lecture3/tasks/atm/task.md @@ -2,18 +2,24 @@ ## Условие -Реализовать класс `Atm`, который хранит купюры фиксированных номиналов и выполняет операции пополнения и выдачи наличных. При ошибках операции должны завершаться выбросом исключения без изменения состояния банкомата. +Реализовать класс `Atm`, который хранит купюры фиксированных +номиналов и выполняет операции пополнения и выдачи наличных. +При ошибках операции должны завершаться выбросом исключения +без изменения состояния банкомата. ## Номиналы -Фиксированный набор номиналов: `50, 100, 200, 500, 1000, 2000, 5000`. +Фиксированный набор номиналов: `50, 100, 200, 500, +1000, 2000, 5000`. Порядок выдачи: жадный алгоритм по убыванию номиналов. ## Публичный API 1. `Atm()` — создаёт пустой банкомат. -1. `void deposit(Map banknotes)` — добавляет купюры (ключ — номинал, значение — количество). -1. `Map withdraw(int amount)` — выдаёт сумму `amount` и возвращает разбиение по номиналам. +1. `void deposit(Map banknotes)` +2. — добавляет купюры (ключ — номинал, значение — количество). +1. `Map withdraw(int amount)` — +2. выдаёт сумму `amount` и возвращает разбиение по номиналам. 1. `int getBalance()` — возвращает текущий баланс. ## Правила ошибок @@ -23,7 +29,8 @@ - номинал не входит в допустимый набор. 1. `InvalidAmountException` — если `amount <= 0`. 1. `InsufficientFundsException` — если `amount > getBalance()`. -1. `CannotDispenseException` — если сумма не набирается доступными купюрами. +1. `CannotDispenseException` — если сумма не набирается +2. доступными купюрами. Во всех случаях при исключении состояние банкомата не изменяется. @@ -35,6 +42,7 @@ - После выдачи `700` (например, `1×500 + 2×100`) баланс `2800`. **Ошибки:** -- Запрос `10_000` при балансе `3000` → `InsufficientFundsException`. +- Запрос `10_000` при балансе `3000` → +`InsufficientFundsException`. - Запрос `375` → `CannotDispenseException`. - Вызов `withdraw(-100)` → `InvalidAmountException`. diff --git a/src/main/java/hse/java/practice/task1/Edge.java b/src/main/java/hse/java/practice/task1/Edge.java index d95ba56b..b23c46ce 100644 --- a/src/main/java/hse/java/practice/task1/Edge.java +++ b/src/main/java/hse/java/practice/task1/Edge.java @@ -35,4 +35,4 @@ public void setParts(CubeColor[][] parts) { public String toString() { return Arrays.deepToString(parts); } -} +} \ No newline at end of file From 72c961b53c313623458b3866830721cee8d0c9f4 Mon Sep 17 00:00:00 2001 From: MuravAna Date: Sat, 28 Feb 2026 12:54:50 +0300 Subject: [PATCH 2/9] add RandomSet implementation --- .../practice/randomSet/RandomSet.java | 136 ++++++++++++++++-- 1 file changed, 128 insertions(+), 8 deletions(-) diff --git a/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java b/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java index 8af477b5..8a9fc02c 100644 --- a/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java +++ b/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java @@ -1,21 +1,141 @@ package hse.java.lectures.lecture3.practice.randomSet; -public class RandomSet { +import java.util.Objects; +import java.util.Random; +public class RandomSet { + private static class Node { + T value; + int index; + Node next; + + Node(T value, int index, Node next) { + this.value = value; + this.index = index; + this.next = next; + } + } + + private static final int CAPACITY = 100; + private static final int PRIME = 15_485_863; + + private Object[] elements; + private Node[] heads; + private int len; + private final Random random = new Random(); + + @SuppressWarnings("unchecked") + public RandomSet() { + elements = new Object[CAPACITY]; + heads = new Node[CAPACITY]; + len = 0; + } + + private int get_hash(T value) { + return (value == null ) ? 0 : Math.abs((int) value.longValue() * PRIME) % heads.length; + } + + private Node findNode(T value) { + int h = get_hash(value); + Node cur = heads[h]; + while (cur != null) { + if (Objects.equals(value, cur.value)) { + return cur; + } + cur = cur.next; + } + return null; + } + + @SuppressWarnings("unchecked") public boolean insert(T value) { - throw new UnsupportedOperationException("Not implemented"); + if (findNode(value) != null) { + return false; + } + + if (len == elements.length) { + Object[] newData = new Object[elements.length * 2]; + for (int i = 0; i < elements.length; i++) { + newData[i] = elements[i]; + } + elements = newData; + } + + elements[len] = value; + + int h = get_hash(value); + heads[h] = new Node<>(value, len, heads[h]); + + len++; + + if (len > heads.length * 0.75) { + Node[] oldHeads = heads; + heads = new Node[oldHeads.length * 2]; + for (Node head : oldHeads) { + Node cur = head; + while (cur != null) { + Node next = cur.next; + int newHash = get_hash(cur.value); + cur.next = heads[newHash]; + heads[newHash] = cur; + cur = next; + } + } + } + + return true; } + @SuppressWarnings("unchecked") public boolean remove(T value) { - throw new UnsupportedOperationException("Not implemented"); + Node node = findNode(value); + if (node == null) { + return false; + } + + int ind = node.index; + + int h = get_hash(value); + Node cur = heads[h]; + Node prev = null; + while (cur != null) { + if (cur == node) { + if (prev == null) { + heads[h] = cur.next; + } else { + prev.next = cur.next; + } + break; + } + prev = cur; + cur = cur.next; + } + + if (ind != len - 1) { + T lastValue = (T) elements[len - 1]; + elements[ind] = lastValue; + + Node lastNode = findNode(lastValue); + if (lastNode != null) { + lastNode.index = ind; + } + } + + len--; + + return true; } public boolean contains(T value) { - throw new UnsupportedOperationException("Not implemented"); + return findNode(value) != null; } - + + @SuppressWarnings("unchecked") public T getRandom() { - throw new UnsupportedOperationException("Not implemented"); + if (len == 0) { + throw new EmptySetException("No elements in the random set"); + } + int randomIndex = random.nextInt(len); + return (T) elements[randomIndex]; } - -} +} \ No newline at end of file From 3ea819f4990a8f13a08e8e874399ce4ccdc35aca Mon Sep 17 00:00:00 2001 From: MuravAna Date: Sat, 28 Feb 2026 13:00:35 +0300 Subject: [PATCH 3/9] add RandomSet implementation 2 --- .../hse/java/lectures/lecture3/practice/randomSet/RandomSet.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java b/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java index 8a9fc02c..9d5d7c3d 100644 --- a/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java +++ b/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java @@ -82,7 +82,6 @@ public boolean insert(T value) { } } } - return true; } From b4f08cd4f7990710aab812b460993527bd431bbf Mon Sep 17 00:00:00 2001 From: MuravAna Date: Sat, 28 Feb 2026 13:23:58 +0300 Subject: [PATCH 4/9] randomset: --- .../hse/java/lectures/lecture3/practice/randomSet/RandomSet.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java b/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java index 9d5d7c3d..2585501a 100644 --- a/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java +++ b/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java @@ -15,7 +15,6 @@ private static class Node { this.next = next; } } - private static final int CAPACITY = 100; private static final int PRIME = 15_485_863; From eb0e57d7f9807b8171d868e655f5374c66f0bdd1 Mon Sep 17 00:00:00 2001 From: MuravAna Date: Sat, 28 Feb 2026 13:28:27 +0300 Subject: [PATCH 5/9] atm: --- src/main/java/hse/java/lectures/lecture3/tasks/atm/Atm.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/hse/java/lectures/lecture3/tasks/atm/Atm.java b/src/main/java/hse/java/lectures/lecture3/tasks/atm/Atm.java index 42e92874..e2dda1bc 100644 --- a/src/main/java/hse/java/lectures/lecture3/tasks/atm/Atm.java +++ b/src/main/java/hse/java/lectures/lecture3/tasks/atm/Atm.java @@ -8,7 +8,7 @@ import java.util.TreeSet; public class Atm { - private enum Denomination { + public enum Denomination { D50(50), D100(100), D500(500), From 3452ee63fb2b44d94048931c2910809102d81a86 Mon Sep 17 00:00:00 2001 From: MuravAna Date: Sat, 28 Feb 2026 13:34:34 +0300 Subject: [PATCH 6/9] randomset: retry --- .../hse/java/lectures/lecture3/practice/randomSet/RandomSet.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java b/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java index 2585501a..9d5d7c3d 100644 --- a/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java +++ b/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java @@ -15,6 +15,7 @@ private static class Node { this.next = next; } } + private static final int CAPACITY = 100; private static final int PRIME = 15_485_863; From b966ce4bb37653d1f71430d7447dfdac5e8be96b Mon Sep 17 00:00:00 2001 From: MuravAna Date: Sat, 28 Feb 2026 13:40:36 +0300 Subject: [PATCH 7/9] randomset: --- .../java/lectures/lecture3/tasks/atm/Atm.java | 139 ++++++------------ 1 file changed, 45 insertions(+), 94 deletions(-) diff --git a/src/main/java/hse/java/lectures/lecture3/tasks/atm/Atm.java b/src/main/java/hse/java/lectures/lecture3/tasks/atm/Atm.java index e2dda1bc..2703387a 100644 --- a/src/main/java/hse/java/lectures/lecture3/tasks/atm/Atm.java +++ b/src/main/java/hse/java/lectures/lecture3/tasks/atm/Atm.java @@ -1,130 +1,81 @@ package hse.java.lectures.lecture3.tasks.atm; -import java.util.Collections; -import java.util.EnumMap; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import java.util.TreeSet; +import java.util.*; public class Atm { - public enum Denomination { - D50(50), - D100(100), - D500(500), - D1000(1000), - D5000(5000); - private final int value; + private static final List ALLOWED_DENOMINATIONS = List.of(5000, 2000, 1000, 500, 200, 100, 50); - Denomination(int value) { - this.value = value; - } - - int value() { - return value; - } - - static Denomination fromValue(int value) { - for (Denomination d : values()) { - if (d.value == value) { - return d; - } - } - throw new IllegalArgumentException("No denomination with value " + value); - } - } - - private final Map banknotes = new EnumMap<>(Denomination.class); + private final Map banknotes = new HashMap<>(); public Atm() { } public void deposit(Map deposit) { if (deposit == null) { - throw new InvalidDepositException("bebebe"); + throw new InvalidDepositException("Deposit map cannot be null"); } + for (Map.Entry entry : deposit.entrySet()) { - Integer denomination_ = entry.getKey(); - if (denomination_ != 50 && denomination_ != 100 && denomination_ != 500 && denomination_ != 1000 && denomination_ != 5000) { - throw new InvalidDepositException("invalid denomination"); + Integer denomination = entry.getKey(); + Integer count = entry.getValue(); + + if (denomination == null || !ALLOWED_DENOMINATIONS.contains(denomination)) { + throw new InvalidDepositException("Invalid denomination: " + denomination); } - Integer amount_ = entry.getValue(); - if (amount_ <= 0) { - throw new InvalidDepositException("invalid amount of banknotes"); + if (count == null || count <= 0) { + throw new InvalidDepositException("Invalid count for denomination " + denomination + ": " + count); } } - Map banknotes_ = new EnumMap<>(Denomination.class); + for (Map.Entry entry : deposit.entrySet()) { - Integer denomination_1 = entry.getKey(); - Integer amount_ = entry.getValue(); - Denomination denom = Denomination.fromValue(denomination_1); - banknotes_.put(denom, this.banknotes.getOrDefault(denom, 0) + amount_); + int denom = entry.getKey(); + int cnt = entry.getValue(); + banknotes.put(denom, banknotes.getOrDefault(denom, 0) + cnt); } - this.banknotes.putAll(banknotes_); } public Map withdraw(int amount) { if (amount <= 0) { - throw new InvalidAmountException( - "invalid amount" - ); + throw new InvalidAmountException("Amount must be positive: " + amount); } if (amount > getBalance()) { - throw new InsufficientFundsException( - "insufficient funds" - ); - } - int am_c = amount; - Map banknotes_to_withdraw = new HashMap<>(); - Map banknotes_ = new EnumMap<>(Denomination.class); - int cnt5000 = Integer.min(amount / 5000, banknotes.getOrDefault(Denomination.D5000, 0)); - amount -= 5000 * cnt5000; - int cnt1000 = Integer.min(amount / 1000, banknotes.getOrDefault(Denomination.D1000, 0)); - amount -= 1000 * cnt1000; - int cnt500 = Integer.min(amount / 500, banknotes.getOrDefault(Denomination.D500, 0)); - amount -= 500 * cnt500; - int cnt100 = Integer.min(amount / 100, banknotes.getOrDefault(Denomination.D100, 0)); - amount -= 100 * cnt100; - int cnt50 = Integer.min(amount / 50, banknotes.getOrDefault(Denomination.D50, 0)); - amount -= 50 * cnt50; - if (amount > 0) { - throw new CannotDispenseException("cannot dispense"); + throw new InsufficientFundsException("Insufficient funds: requested " + amount + ", balance " + getBalance()); } - amount = am_c; - if (cnt5000 > 0) - banknotes_to_withdraw.put(5000, cnt5000); - if (cnt1000 > 0) - banknotes_to_withdraw.put(1000, cnt1000); - if (cnt500 > 0) - banknotes_to_withdraw.put(500, cnt500); - if (cnt100 > 0) - banknotes_to_withdraw.put(100, cnt100); - if (cnt50 > 0) - banknotes_to_withdraw.put(50, cnt50); - banknotes_.put(Denomination.D5000, this.banknotes.getOrDefault(Denomination.D5000, 0) - cnt5000); + Map withdrawal = new HashMap<>(); + int remaining = amount; - banknotes_.put(Denomination.D1000, this.banknotes.getOrDefault(Denomination.D1000, 0) - cnt1000); + for (int denom : ALLOWED_DENOMINATIONS) { + int available = banknotes.getOrDefault(denom, 0); + if (available == 0) continue; - banknotes_.put(Denomination.D500, this.banknotes.getOrDefault(Denomination.D500, 0) - cnt500); + int maxPossible = remaining / denom; + int used = Math.min(maxPossible, available); + if (used > 0) { + withdrawal.put(denom, used); + remaining -= used * denom; + } + } - banknotes_.put(Denomination.D100, this.banknotes.getOrDefault(Denomination.D100, 0) - cnt100); + if (remaining != 0) { + throw new CannotDispenseException("Cannot dispense amount " + amount + " with available banknotes"); + } - banknotes_.put(Denomination.D50, this.banknotes.getOrDefault(Denomination.D50, 0) - cnt50); + for (Map.Entry entry : withdrawal.entrySet()) { + int denom = entry.getKey(); + int used = entry.getValue(); + banknotes.put(denom, banknotes.get(denom) - used); + } - this.banknotes.putAll(banknotes_); - return banknotes_to_withdraw; + return withdrawal; } public int getBalance() { - int ans = 0; - ans += this.banknotes.getOrDefault(Denomination.D5000, 0) * 5000; - ans += this.banknotes.getOrDefault(Denomination.D1000, 0) * 1000; - ans += this.banknotes.getOrDefault(Denomination.D500, 0) * 500; - ans += this.banknotes.getOrDefault(Denomination.D100, 0) * 100; - ans += this.banknotes.getOrDefault(Denomination.D50, 0) * 50; - return ans; + int total = 0; + for (Map.Entry entry : banknotes.entrySet()) { + total += entry.getKey() * entry.getValue(); + } + return total; } - -} +} \ No newline at end of file From 3a063d744c06a77f2eaaf3d67bf2c0562ce56c5b Mon Sep 17 00:00:00 2001 From: MuravAna Date: Sat, 28 Feb 2026 13:43:27 +0300 Subject: [PATCH 8/9] randomset --- .../java/lectures/lecture3/tasks/atm/Atm.java | 82 ++++++------------- 1 file changed, 23 insertions(+), 59 deletions(-) diff --git a/src/main/java/hse/java/lectures/lecture3/tasks/atm/Atm.java b/src/main/java/hse/java/lectures/lecture3/tasks/atm/Atm.java index 2703387a..c5312010 100644 --- a/src/main/java/hse/java/lectures/lecture3/tasks/atm/Atm.java +++ b/src/main/java/hse/java/lectures/lecture3/tasks/atm/Atm.java @@ -3,79 +3,43 @@ import java.util.*; public class Atm { + public enum Denomination { + D50(50), + D100(100), + D500(500), + D1000(1000), + D5000(5000); - private static final List ALLOWED_DENOMINATIONS = List.of(5000, 2000, 1000, 500, 200, 100, 50); + private final int value; - private final Map banknotes = new HashMap<>(); - - public Atm() { - } - - public void deposit(Map deposit) { - if (deposit == null) { - throw new InvalidDepositException("Deposit map cannot be null"); + Denomination(int value) { + this.value = value; } - for (Map.Entry entry : deposit.entrySet()) { - Integer denomination = entry.getKey(); - Integer count = entry.getValue(); - - if (denomination == null || !ALLOWED_DENOMINATIONS.contains(denomination)) { - throw new InvalidDepositException("Invalid denomination: " + denomination); - } - if (count == null || count <= 0) { - throw new InvalidDepositException("Invalid count for denomination " + denomination + ": " + count); - } + int value() { + return value; } - for (Map.Entry entry : deposit.entrySet()) { - int denom = entry.getKey(); - int cnt = entry.getValue(); - banknotes.put(denom, banknotes.getOrDefault(denom, 0) + cnt); + public static Denomination fromInt(int value) { + return Arrays.stream(values()).filter(v -> v.value == value) + .findFirst() + .orElse(null); } } - public Map withdraw(int amount) { - if (amount <= 0) { - throw new InvalidAmountException("Amount must be positive: " + amount); - } - if (amount > getBalance()) { - throw new InsufficientFundsException("Insufficient funds: requested " + amount + ", balance " + getBalance()); - } - - Map withdrawal = new HashMap<>(); - int remaining = amount; - - for (int denom : ALLOWED_DENOMINATIONS) { - int available = banknotes.getOrDefault(denom, 0); - if (available == 0) continue; + private final Map banknotes = new EnumMap<>(Denomination.class); - int maxPossible = remaining / denom; - int used = Math.min(maxPossible, available); - if (used > 0) { - withdrawal.put(denom, used); - remaining -= used * denom; - } - } - - if (remaining != 0) { - throw new CannotDispenseException("Cannot dispense amount " + amount + " with available banknotes"); - } + public Atm() { + } - for (Map.Entry entry : withdrawal.entrySet()) { - int denom = entry.getKey(); - int used = entry.getValue(); - banknotes.put(denom, banknotes.get(denom) - used); - } + public void deposit(Map banknotes){} - return withdrawal; + public Map withdraw(int amount) { + return Map.of(); } public int getBalance() { - int total = 0; - for (Map.Entry entry : banknotes.entrySet()) { - total += entry.getKey() * entry.getValue(); - } - return total; + return 0; } + } \ No newline at end of file From 73beaaf2bd21200e7a258137d5d329ab0985ada9 Mon Sep 17 00:00:00 2001 From: MuravAna Date: Sat, 28 Feb 2026 13:44:32 +0300 Subject: [PATCH 9/9] randomset: --- .../hse/java/lectures/lecture3/practice/randomSet/RandomSet.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java b/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java index 9d5d7c3d..bba6d5c3 100644 --- a/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java +++ b/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java @@ -16,6 +16,7 @@ private static class Node { } } + private static final int CAPACITY = 100; private static final int PRIME = 15_485_863;