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

leetcode 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] <= 10^9
  • 1 <= amount <= 10^9
  • 总共 最多有 5000 次 withdraw 和 deposit 的调用。
  • 函数 withdraw 和 deposit 至少各有 一次 调用。

分析:按照要求写模块即可。注意到取钱的时候需要一次得到能取多少张。

typedef struct {
    int num[5];//分别代表20,50,100,200,500的钞票数量
} ATM;


ATM* aTMCreate() {
    ATM *p=(ATM*)malloc(sizeof(ATM));
    for(int i=0;i<5;++i)
        p->num[i]=0;//初始化钞票数量为0
    return p;
}

void aTMDeposit(ATM* obj, int* banknotesCount, int banknotesCountSize) {
    for(int i=0;i<banknotesCountSize;++i)
        obj->num[i]+=banknotesCount[i];//更新钞票数量直接加上即可
    return;
}

int* aTMWithdraw(ATM* obj, int amount, int* retSize) {
    int f=1;
    int cnt[5]={20,50,100,200,500},temp[5];
    int *ans=(int*)malloc(sizeof(int)*5);*retSize=5;
    for(int i=0;i<5;++i)ans[i]=0,temp[i]=obj->num[i];
    for(int i=4;i>=0;--i)
    {
        if(amount>0&&temp[i]>0)//能减就尽量减
        {
            int l1=amount/cnt[i],l2=temp[i];
            amount=amount-fmin(l1,l2)*cnt[i];
            ans[i]+=fmin(l1,l2),temp[i]-=fmin(l1,l2);
        }
        if(amount==0)break;
    }
    if(amount!=0)*retSize=1,ans[0]=-1;
    else for(int i=0;i<5;++i)obj->num[i]=temp[i];
/*
    for(int i=0;i<5;++i)
        printf("i=%d num=%d\n",i,obj->num[i]);
    printf("\n");
*/
    return ans;
}

void aTMFree(ATM* obj) {
    free(obj);
    return;
}
/**
 * Your ATM struct will be instantiated and called as such:
 * ATM* obj = aTMCreate();
 * aTMDeposit(obj, banknotesCount, banknotesCountSize);
 
 * int* param_2 = aTMWithdraw(obj, amount, retSize);
 
 * aTMFree(obj);
*/


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

相关文章:

  • 实现AVL树
  • 【模型部署】实例(附代码)
  • 汇编环境搭建
  • 前端工程化之手搓webpack5 --【elpis全栈项目】
  • 使用 Try-With-Resources 简化资源管理
  • 一文讲明白朴素贝叶斯算法及其计算公式(入门普及)
  • 幸运彩票(PTA)C语言
  • Ansys Maxwell:3PH 变压器电感计算
  • 代码段中使用数据、栈
  • leetCode 33:搜索旋转排序数组
  • Android 系统服务DisplayManagerService和DisplayDevice生命周期解读
  • Redis数据库笔记——ZSet的底层实现(跳表)
  • 密码学原理技术-第十四章-Key Management
  • 力扣-20-有效的括号-栈
  • Qt笔记:网络编程Tcp
  • 自闭症儿童康复个案研究:深度解析治疗效果
  • C/C++中new/delete与malloc/free的区别及对象管理
  • Hello 2025
  • 《机器学习》从入门到实战——决策树
  • 记录一次电脑被入侵用来挖矿的过程(Trojan、Miner、Hack、turminoob)
  • 算法13、基础二分查找的应用(木根切割等)
  • kubernetes-循序渐进了解coredns
  • 打造三甲医院人工智能矩阵新引擎(二):医学影像大模型篇--“火眼金睛”TransUNet
  • Spring Boot教程之四十九:Spring Boot – MongoRepository 示例
  • 【数据结构与算法:二、线性表】
  • Zookeeper模式安装Kafka(含常规、容器两种安装方式)