当前位置: 首页 > article >正文

【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 0banknotesCount[i]109
  • 1 ≤ a m o u n t ≤ 1 0 9 1 \le amount \le 10 ^ 9 1amount109
  • 总共 最多有 5000 5000 5000withdrawdeposit 的调用
  • 函数 withdrawdeposit 至少各有 一次 调用

解题过程

是不相信自己的一天,想到了倒序遍历数组,想着或许有更好的解法,没去写。
以后不管自己的想法有多糟糕,都要去实现出来看看。

具体实现

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);
 */

http://www.kler.cn/a/468657.html

相关文章:

  • 创建型模式2.抽象工厂模式
  • HTML - <a>
  • GoFrame 基础入门
  • springboot550乐乐农产品销售系统(论文+源码)_kaic
  • 【NLP高频面题 - Transformer篇】Transformer的输入中为什么要添加位置编码?
  • Redis数据库笔记—— Hash(哈希)的扩容机制(rehash)
  • 12.3【hardware][day3]
  • springboot优先级和ThreadLocal
  • Docker, Moby, Containers
  • Tailwind CSS 实战:深色模式设计与实现
  • Coroutine 基础八 —— Flow 操作符(二)
  • CPT203 Software Engineering 软件工程 Pt.3 系统建模(中英双语)
  • 五月天TV 1.1.0 | 频道丰富的娱乐向电视直播应用
  • 使用大语言模型的生物嵌入,后续应该会有很多类似文章出来!
  • VSCode 在Windows下开发时使用Cmake Tools时输出Log乱码以及CPP文件乱码的终极解决方案
  • 信息系统管理师试题-人力资源
  • 高校教务系统登录页面JS分析——安徽大学
  • Level DB --- BloomFilterPolicy
  • List-顺序表--2
  • Go语言的 的泛型(Generics)核心知识
  • Eclipse Memory Analyzer (MAT)
  • MongoDB基本操作
  • 常见的反规范化技术
  • 在大型语言模型LLM中使用私有数据
  • Ansible之批量管理服务器
  • 高效撰写文献综述的指南:利用ChatGPT提升研究能力