Leetcode打卡:设计一个ATM机器

执行结果:通过


题目 2241 设计一个ATM机器

一个 ATM 机器,存有 5 种面值的钞票:20 ,50 ,100 ,200 和 500 美元。初始时,ATM 机是空的。用户可以用它存或者取任意数目的钱。

取款时,机器会优先取 较大 数额的钱。

  • 比方说,你想取 $300 ,并且机器里有 2 张 $50 的钞票,1 张 $100 的钞票和1 张 $200 的钞票,那么机器会取出 $100 和 $200 的钞票。
  • 但是,如果你想取 $600 ,机器里有 3 张 $200 的钞票和1 张 $500 的钞票,那么取款请求会被拒绝,因为机器会先取出 $500 的钞票,然后无法取出剩余的 $100 。注意,因为有 $500 钞票的存在,机器 不能 取 $200 的钞票。

请你实现 ATM 类:

  • ATM() 初始化 ATM 对象。
  • void deposit(int[] banknotesCount) 分别存入 $20 ,$50$100$200 和 $500 钞票的数目。
  • int[] withdraw(int amount) 返回一个长度为 5 的数组,分别表示 $20 ,$50$100 ,$200 和 $500 钞票的数目,并且更新 ATM 机里取款后钞票的剩余数量。如果无法取出指定数额的钱,请返回 [-1] (这种情况下  取出任何钞票)。

示例 1:

输入:
["ATM", "deposit", "withdraw", "deposit", "withdraw", "withdraw"]
[[], [[0,0,1,2,1]], [600], [[0,1,0,1,1]], [600], [550]]
输出:
[null, null, [0,0,1,0,1], null, [-1], [0,1,0,0,1]]解释:
ATM atm = new ATM();
atm.deposit([0,0,1,2,1]); // 存入 1 张 $100 ,2 张 $200 和 1 张 $500 的钞票。
atm.withdraw(600);        // 返回 [0,0,1,0,1] 。机器返回 1 张 $100 和 1 张 $500 的钞票。机器里剩余钞票的数量为 [0,0,0,2,0] 。
atm.deposit([0,1,0,1,1]); // 存入 1 张 $50 ,1 张 $200 和 1 张 $500 的钞票。// 机器中剩余钞票数量为 [0,1,0,3,1] 。
atm.withdraw(600);        // 返回 [-1] 。机器会尝试取出 $500 的钞票,然后无法得到剩余的 $100 ,所以取款请求会被拒绝。// 由于请求被拒绝,机器中钞票的数量不会发生改变。
atm.withdraw(550);        // 返回 [0,1,0,0,1] ,机器会返回 1 张 $50 的钞票和 1 张 $500 的钞票。

提示:

  • banknotesCount.length == 5
  • 0 <= banknotesCount[i] <= 109
  • 1 <= amount <= 109
  • 总共 最多有 5000 次 withdraw 和 deposit 的调用。
  • 函数 withdraw 和 deposit 至少各有 一次 调用。

代码以及解题思路

代码

class ATM:def __init__(self):self.d = [20, 50, 100, 200, 500]self.m = len(self.d)self.cnt = [0] * self.mdef deposit(self, banknotesCount: List[int]) -> None:for i, x in enumerate(banknotesCount):self.cnt[i] += xdef withdraw(self, amount: int) -> List[int]:ans = [0] * self.mfor i in reversed(range(self.m)):ans[i] = min(amount // self.d[i], self.cnt[i])amount -= ans[i] * self.d[i]if amount > 0:return [-1]for i, x in enumerate(ans):self.cnt[i] -= xreturn ans

解题思路:

类定义和初始化

  • ATM 类有三个属性:
    • d:一个列表,存储ATM机支持的钞票面额,按从小到大的顺序排列。
    • m:钞票面额的数量。
    • cnt:一个列表,存储每种面额的钞票数量,初始化为0。

存款方法 deposit

  • 输入参数 banknotesCount 是一个列表,表示用户存入的每种面额钞票的数量。
  • 方法遍历 banknotesCount 列表,将每种面额的钞票数量加到 cnt 列表的对应位置。

取款方法 withdraw

  • 输入参数 amount 是一个整数,表示用户希望取出的总金额。
  • 方法返回一个列表,表示为了凑出 amount 金额,ATM机应该支付的每种面额的钞票数量。如果无法凑出 amount 金额,则返回 [-1]

取款方法的实现步骤如下:

  1. 初始化一个与 cnt 列表长度相同的列表 ans,用于存储每种面额钞票的支付数量,初始化为0。
  2. 从最大面额的钞票开始遍历(使用 reversed(range(self.m))),对于每种面额:
    • 计算可以支付的最大数量,即用户请求的金额 amount 除以当前面额 self.d[i],与当前面额钞票的库存数量 self.cnt[i] 中的较小值。
    • 更新 ans[i] 为计算出的支付数量。
    • 更新 amount 为剩余需要支付的金额,即 amount 减去已支付的金额 ans[i] * self.d[i]
  3. 如果遍历完所有面额后,amount 仍然大于0,表示无法凑出用户请求的金额,返回 [-1]
  4. 如果可以凑出用户请求的金额,遍历 ans 列表,更新 cnt 列表,减去已支付的每种面额钞票的数量。
  5. 返回 ans 列表,表示支付的每种面额钞票的数量。

总结

这段代码通过维护一个钞票面额列表和一个每种面额钞票数量的列表,实现了存款和取款的基本功能。取款功能通过从最大面额开始尝试支付,确保尽可能使用较少种类的钞票来满足用户的请求。如果无法完全满足用户的取款请求,则返回 [-1]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/66253.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

0. 总框架

第1阶段&#xff0c;c语言层面 (1) c语言基本语法&#xff1a;结构体、指针、宏 (2) 数据结构和算法&#xff1a;hash&#xff0c;rbtree&#xff0c;b/btree&#xff0c;linked list(链表) 1.2.1-1部分数据结构的说明-CSDN博客 1.2.1-2部分数据结构的说明02_链表-CSDN博客…

比Qt更适合小公司的C++界面开发框架wxWidgets

C++行业里,如果一家小公司对某些费用方面问题特别敏感,而且你做的产品属于消费品领域,那么你最好还是选择wxWidgets来替代Qt。 Qt的好处是保罗大部分常用的开发库,它不用你会C++ STL,因为它本身就很成熟,你无需使用STL库去补充功能,所以我经常看到很多小公司的招聘信息…

源码理解 UE4中的 FCookStatsManager::FAutoRegisterCallback RegisterCookStats

官方文档&#xff1a;https://dev.epicgames.com/documentation/zh-cn/unreal-engine/API/Runtime/Core/ProfilingDebugging/FCookStatsManager文档中的注释&#xff1a; When a cook a complete that is configured to use stats (ENABLE_COOK_STATS), it will broadcast this…

vscode如何离线安装插件

在没有网络的时候,如果要安装插件,就会麻烦一些,需要通过离线安装的方式进行。下面记录如何在vscode离线安装插件。 一、下载离线插件 在一台能联网的电脑中,下载好离线插件,拷贝到无法联网的电脑上。等待安装。 vscode插件商店地址:https://marketplace.visualstudio.co…

趋炎附势的合理性

趋炎附势常被视为负面行为&#xff0c;例如某个人当上了大官&#xff0c;之前不没有联系的人都开始联系了&#xff0c;为的是以后有需要帮忙的事可以找他。这样趋炎附势的行为往往令人不齿&#xff0c;但是仍然有一定的合理性&#xff0c;主要在社会资源优化配置、优质个体的选…

Android:文件管理:打开文件意图

三步走&#xff1a; 一、先在AndroidManifest.xml声明provider&#xff1a; <providerandroid:name"androidx.core.content.FileProvider"android:authorities"${applicationId}.FileProvider"android:exported"false"android:grantUriPermi…

用Tkinter制作一个用于合并PDF文件的小程序

需要安装PyPDF2库&#xff0c;具体原代码如下&#xff1a; # -*- coding: utf-8 -*- """ Created on Sun Dec 29 14:44:20 2024author: YBK """import PyPDF2 import os import tkinter as tk import windndpdf_files [] def dragged_files(f…

spring mvc源码学习笔记之四

pom.xml 内容如下 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

CDP集成Hudi实战-Hive

[〇]关于本文 本文测试一下使用Hive和Hudi的集成 软件版本Hudi1.0.0Hadoop Version3.1.1.7.3.1.0-197Hive Version3.1.3000.7.3.1.0-197Spark Version3.4.1.7.3.1.0-197CDP7.3.1 [一]部署Jar包 1-部署hudi-hive-sync-bundle-1.0.0.jar文件 [rootcdp73-1 ~]# for i in $(se…

公司资产网站

本文结尾处获取源码。 本文结尾处获取源码。 本文结尾处获取源码。 一、相关技术 后端&#xff1a;Java、JavaWeb / Springboot。前端&#xff1a;Vue、HTML / CSS / Javascript 等。数据库&#xff1a;MySQL 二、相关软件&#xff08;列出的软件其一均可运行&#xff09; I…

Java中如何实现线程安全的单例模式?

目录 1、懒汉式&#xff08;线程安全&#xff09; 2、饿汉式&#xff08;线程安全&#xff09; 3、双重校验锁&#xff08;线程安全&#xff09; 4、静态内部类&#xff08;推荐&#xff09; 5、枚举&#xff08;最佳方法&#xff09; 6、总结 在Java中&#xff0c;实现线…

CSS——2.书写格式一

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><body><!--css书写中&#xff1a;--><!--1.css 由属性名:属性值构成--><!--style"color: red;font-size: 20px;&quo…

CBAM (Convolutional Block Attention Module)注意力机制详解

定义与起源 CBAM (Convolutional Block Attention Module) 是一种专为卷积神经网络(CNN)设计的注意力机制, 旨在增强模型对关键特征的捕捉能力 。这一创新概念首次出现在2018年的研究论文《CBAM: Convolutional Block Attention Module》中。CBAM的核心思想是在通道和空间两个…

基于FPGA的辩论赛系统设计-8名选手-正反两方-支持单选手评分-正反两方评分总和

基于FPGA的辩论赛系统设计 功能描述一、系统概述二、仿真波形视频 功能描述 1.答辩倒计时功能&#xff0c;当正反任意一方开始答辩后&#xff0c;倒计时30S。在倒计时最后10S后&#xff0c;LED灯开始闪烁。 2.答辩评分和计分功能&#xff0c;当答辩方结束答辩后&#xff0c;评…

【OceanBase】使用 Superset 连接 OceanBase 数据库并进行数据可视化分析

文章目录 前言一、前提条件二、操作步骤2.1 准备云主机实例2.2 安装docker-compose2.3 使用docker-compose安装Superset2.3.1 克隆 Superset 的 GitHub 存储库2.3.2 通过 Docker Compose 启动 Superset 2.4 开通 OB Cloud 云数据库2.5 获取连接串2.6 使用 Superset 连接 OceanB…

余华和他的书

穿透现实&#xff0c;启迪心灵 引言 今天我们来聊聊中国文学界的一位大佬——余华。这位老兄可不简单&#xff0c;他的文字就像是给社会做“心灵手术”&#xff0c;刀刀见血&#xff0c;却又精准无比。他的作品不仅在中国家喻户晓&#xff0c;在国际上也是响当当的。那么&…

Go语言的 的数据封装(Data Encapsulation)基础知识

Go语言的数据封装&#xff08;Data Encapsulation&#xff09;基础知识 引言 数据封装&#xff08;Data Encapsulation&#xff09;是面向对象编程&#xff08;OOP&#xff09;的核心概念之一。它通过将数据和对数据的操作封装到一个单独的模块中&#xff0c;来实现高度的抽象…

打造三甲医院人工智能矩阵新引擎(二):医学影像大模型篇--“火眼金睛”TransUNet

一、引言 1.1 研究背景与意义 在现代医疗领域,医学影像作为疾病诊断与治疗的关键依据,发挥着不可替代的作用。从传统的X射线、CT(计算机断层扫描)到MRI(磁共振成像)等先进技术,医学影像能够直观呈现人体内部结构,为医生提供丰富的诊断信息,涵盖疾病识别、病灶定位、…

计算机缺失x3daudio1 7.dll怎么修复?

电脑运行时常见问题解析与修复策略&#xff1a;以“x3daudio1_7.dll缺失”为例 在软件开发与日常电脑维护的广阔领域中&#xff0c;我们时常会遇到各种系统报错和文件问题。这些问题不仅影响我们的工作效率&#xff0c;还可能对数据安全构成潜在威胁。作为一位经验丰富的软件开…

WPF区域导航+导航参数使用+路由守卫+导航日志

背景&#xff1a;使用ContentControl控件实现区域导航是有Mvvm框架的WPF都能使用的&#xff0c;不限于Prism 主要是将ContenControl控件的Content内容在ViewModel中切换成不同的用户控件 下面是MainViewModel&#xff1a; private object body;public object Body {get { retu…