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 并不存在。
解題思路
維護一個代表用戶余額的數組,對于轉賬,存款,取款操作,我們都需要對參數進行校驗,保證指定的賬戶數量在 1 和 n 之間,且取款或者轉賬需要的錢的總數 小于或者等于 賬戶余額。對于轉賬來說,可以看成從兩個不同的賬號分別進行取款和存款。
代碼
class Bank {long[] balance;public Bank(long[] balance) {this.balance=balance;}public boolean transfer(int account1, int account2, long money) {if (!withdraw(account1,money))return false;if (!deposit(account2,money)){deposit(account1,money);return false;}return true;}public boolean deposit(int account, long money) {if (account-1<0||account-1>=balance.length)return false;balance[account-1]+=money;return true;}public boolean withdraw(int account, long money) {if (account-1<0||account-1>=balance.length)return false;if (money>balance[account-1])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);*//*** 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);*/