【Leetcode 每日一题】2241. 设计一个 ATM 机器
问题背景
一个 ATM 机器,存有
5
5
5 种面值的钞票:
20
20
20,
50
50
50,
100
100
100,
200
200
200 和
500
500
500 美元。初始时,ATM 机是空的。用户可以用它存或者取任意数目的钱。
取款时,机器会优先取 较大 数额的钱。
- 比方说,你想取 300 300 300,并且机器里有 2 2 2 张 50 50 50 的钞票, 1 1 1 张 100 100 100 的钞票和 1 1 1 张 200 200 200 的钞票,那么机器会取出 100 100 100 和 200 200 200 的钞票。
- 但是,如果你想取 600 600 600,机器里有 3 3 3 张 200 200 200 的钞票和 1 1 1 张 500 500 500 的钞票,那么取款请求会被拒绝,因为机器会先取出 500 500 500 的钞票,然后无法取出剩余的 100 100 100。注意,因为有 500 500 500 钞票的存在,机器 不能 取 200 200 200 的钞票。
请你实现 ATM
类:
ATM()
初始化 ATM 对象。void deposit(int[] banknotesCount)
分别存入 20 20 20, 50 50 50, 100 100 100, 200 200 200 和 500 500 500钞票的数目。int[] withdraw(int amount)
返回一个长度为 5 5 5 的数组,分别表示 20 20 20, 50 50 50, 100 100 100, 200 200 200 和 500 500 500 钞票的数目,并且更新 ATM 机里取款后钞票的剩余数量。如果无法取出指定数额的钱,请返回 [ − 1 ] [-1] [−1](这种情况下 不 取出任何钞票)。
数据约束
- b a n k n o t e s C o u n t . l e n g t h = 5 banknotesCount.length = 5 banknotesCount.length=5
- 0 ≤ b a n k n o t e s C o u n t [ i ] ≤ 1 0 9 0 \le banknotesCount[i] \le 10 ^ 9 0≤banknotesCount[i]≤109
- 1 ≤ a m o u n t ≤ 1 0 9 1 \le amount \le 10 ^ 9 1≤amount≤109
- 总共 最多有
5000
5000
5000 次
withdraw
和deposit
的调用 - 函数
withdraw
和deposit
至少各有 一次 调用
解题过程
是不相信自己的一天,想到了倒序遍历数组,想着或许有更好的解法,没去写。
以后不管自己的想法有多糟糕,都要去实现出来看看。
具体实现
class ATM {
private static final int[] DENOMINATIONS = {20, 50, 100, 200, 500};
private static final int KINDS = DENOMINATIONS.length;
private final int[] banknotes = new int[KINDS];
public ATM() {
int[] res = new int[KINDS];
}
public void deposit(int[] banknotesCount) {
for(int i = 0; i < KINDS; i++) {
banknotes[i] += banknotesCount[i];
}
}
public int[] withdraw(int amount) {
int[] res = new int[KINDS];
for(int i = KINDS - 1; i >= 0; i--) {
res[i] = Math.min(amount / DENOMINATIONS[i], banknotes[i]);
amount -= res[i] * DENOMINATIONS[i];
}
if(amount != 0) {
return new int[]{-1};
}
for(int i = 0; i < KINDS; i++) {
banknotes[i] -= res[i];
}
return res;
}
}
/**
* Your ATM object will be instantiated and called as such:
* ATM obj = new ATM();
* obj.deposit(banknotesCount);
* int[] param_2 = obj.withdraw(amount);
*/