简易银行系统_leetcode

这篇博客介绍了一个银行系统的实现,包括转账、存款和取款操作。通过一个Bank类,处理了账户余额的增减,并确保交易有效性。在transfer方法中,检查账户是否存在及余额是否充足;deposit方法直接增加账户余额;withdraw方法则检查余额是否足够。博客给出了具体的示例和测试用例,展示了各种情况下的交易结果。

leetcode 2043. 简易银行系统
你的任务是为一个很受欢迎的银行设计一款程序,以自动化执行所有传入的交易(转账,存款和取款)。银行共有 n 个账户,编号从 1 到 n 。每个账号的初始余额存储在一个下标从 0 开始的整数数组 balance 中,其中第 (i + 1) 个账户的初始余额是 balance[i] 。

请你执行所有 有效的 交易。如果满足下面全部条件,则交易 有效 :

指定的账户数量在 1 和 n 之间,且
取款或者转账需要的钱的总数 小于或者等于 账户余额。
实现 Bank 类:

Bank(long[] balance) 使用下标从 0 开始的整数数组 balance 初始化该对象。
boolean transfer(int account1, int account2, long money) 从编号为 account1 的账户向编号为 account2 的账户转帐 money 美元。如果交易成功,返回 true ,否则,返回 false 。
boolean deposit(int account, long money) 向编号为 account 的账户存款 money 美元。如果交易成功,返回 true ;否则,返回 false 。
boolean withdraw(int account, long money) 从编号为 account 的账户取款 money 美元。如果交易成功,返回 true ;否则,返回 false 。

示例:

输入:
[“Bank”, “withdraw”, “transfer”, “deposit”, “transfer”, “withdraw”]
[[[10, 100, 20, 50, 30]], [3, 10], [5, 1, 20], [5, 20], [3, 4, 15], [10, 50]]
输出:
[null, true, true, true, false, false]

解释:
Bank bank = new Bank([10, 100, 20, 50, 30]);
bank.withdraw(3, 10); // 返回 true ,账户 3 的余额是 $20 ,所以可以取款 $10 。
// 账户 3 余额为 $20 - $10 = $10 。
bank.transfer(5, 1, 20); // 返回 true ,账户 5 的余额是 $30 ,所以可以转账 $20 。
// 账户 5 的余额为 $30 - $20 = $10 ,账户 1 的余额为 $10 + $20 = $30 。
bank.deposit(5, 20); // 返回 true ,可以向账户 5 存款 $20 。
// 账户 5 的余额为 $10 + $20 = $30 。
bank.transfer(3, 4, 15); // 返回 false ,账户 3 的当前余额是 $10 。
// 所以无法转账 $15 。
bank.withdraw(10, 50); // 返回 false ,交易无效,因为账户 10 并不存在。

提示:

n == balance.length
1 <= n, account, account1, account2 <= 105
0 <= balance[i], money <= 1012
transfer, deposit, withdraw 三个函数,每个 最多调用 104 次

解答:java
思路与算法:

已有的帐号为 11 到 nn,分别对三种操作进行分析:
transfer 操作
如果要进行操作的帐号不在已有的帐号中,即 \textit{account1} > naccount1>n 或者 \textit{account2} > naccount2>n,那么交易无效。如果账号 \textit{account1}account1 的余额小于 \textit{money}money,那么交易无效。交易有效时,我们将账号 \textit{account1}account1 的余额减少 \textit{money}money,账号 \textit{account2}account2 的余额增加 \textit{money}money。
deposit 操作
如果要进行操作的帐号不在已有的帐号中,即 \textit{account} > naccount>n,那么交易无效。交易有效时,我们将账号 \textit{account}account 的余额增加 \textit{money}money。
withdraw 操作
如果要进行操作的帐号不在已有的帐号中,即 \textit{account} > naccount>n,那么交易无效。如果账号 \textit{account}account 的余额小于 \textit{money}money,那么交易无效。交易有效时,我们将账号 \textit{account}account 的余额减少 \textit{money}money。

class Bank {
    long[] balance;  
    boolean check(int a) {
        return a > 0 && a <= balance.length;
    } 

    public Bank(long[] balance) {
        this.balance = balance;
    }
    
    public boolean transfer(int account1, int account2, long money) {
        if (check(account2) && withdraw(account1, money))
            return deposit(account2, money);
        return false;
    }
    
    public boolean deposit(int account, long money) {
        if (!check(account)) return false;
        balance[account - 1] += money;
        return true;
    }
    
    public boolean withdraw(int account, long money) {
        if (!check(account) || balance[account - 1] < money)
            return false;
        balance[account - 1] -= money;
        return true; 
    }
}

/**
 * Your Bank object will be instantiated and called as such:
 * Bank obj = new Bank(balance);
 * boolean param_1 = obj.transfer(account1,account2,money);
 * boolean param_2 = obj.deposit(account,money);
 * boolean param_3 = obj.withdraw(account,money);
 */

输入
[“Bank”,“withdraw”,“transfer”,“deposit”,“transfer”,“withdraw”]
[[[10,100,20,50,30]],[3,10],[5,1,20],[5,20],[3,4,15],[10,50]]
输出
[null,true,true,true,false,false]
预期结果
[null,true,true,true,false,false]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值