前往
大廳
主題

LeetCode - 2043. Simple Bank System 解題心得

Not In My Back Yard | 2022-04-04 00:00:10 | 巴幣 0 | 人氣 166

題目連結:


題目意譯:
你被要求為一間有名的銀行撰寫一個程式,其將自動化處理所有輸入的交易(轉帳(Transfer)、存款(Deposit)以及提款(Withdraw))。銀行有著 n 個帳戶編號為 1 到 n。每個帳戶一開始的帳戶結餘儲存於一個索引值從 0 開始的整數陣列 balance,其中 balance[i] 代表著編號 i + 1 的帳戶有的結餘金額。

執行所有合法的交易。一次交易是合法的,如果
給定的帳戶編號介於 1 到 n 之間,且
提款或是轉帳金額小於或等於該帳戶的結餘金額。

實作類別 Bank:
Bank(long[] balance) 初始化物件,其有著一個索引值從 0 開始數的整數陣列 balance。
boolean transfer(int account1, int account2, long money) 從帳戶編號 account1 轉移 money 元至帳戶編號 account2。回傳真(True)如果交易是成功的,反之回傳假(False)。
boolean deposit(int account, long money) 存入 money 元至編號 account 之帳戶。回傳真如果交易是成功的,反之回傳假。
boolean withdraw(int account, long money) 從編號 account 之帳戶提出 money 元。回傳真如果交易是成功的,反之回傳假。

限制:
n == balance.length
1 ≦ n, account, account1, account2 ≦ 10 ^ 5
0 ≦ balance[i], money ≦ 10 ^ 12
至多呼叫 transfer, deposit 和 withdraw 共 10 ^ 4 次。



範例測資:
範例 1:
輸入
["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);    // 回傳真,帳戶 3 結餘為 $20,所以提出 $10 是合法的。
                         // 帳戶 3 結餘為 $20 - $10 = $10。
bank.transfer(5, 1, 20); // 回傳真,帳戶 5 結餘為 $30,所以從中轉移 $20 是合法的。
                         // 帳戶 5 結餘為 $30 - $20 = $10,而 帳戶 1 結餘為 $10 + $20 = $30。
bank.deposit(5, 20);     // 回傳真,存入 $20 至帳戶 5 是合法的。
                         // 帳戶 5 結餘為 $10 + $20 = $30。
bank.transfer(3, 4, 15); // 回傳假,帳戶 3 當前結餘為 $10,
                         // 所以從中轉移 $15 是不合法的。
bank.withdraw(10, 50);   // 回傳假,因為帳戶 10 不存在所以不合法。


解題思維:
模擬照作即可。

對於 transfer 、 deposit 以及 withdraw 每個函式我們都先檢查傳入的帳戶編號是否超出範圍(注意 transfer 有兩個帳戶要檢查)。超出範圍即回傳假。

接著對於 deposit(account, money),由於結餘金額只會增加不會減少(因為 money 不為負),因此就單純地直接把 balance[account - 1] 加上 money 後回傳真即可(注意 balance 的索引值恰好與實際帳戶編號少 1)。

再來對於 withdraw(account, money),我們先檢查 balance[account - 1] 是否小於 money。如果小於的話,代表本次操作不合法,因此回傳假;反之,我們將 balance[account - 1] 減去 money 並回傳真即可。

最後對於 transfer(account1, account2, money),我們同樣也先檢查 balance[account1 - 1] 是否小於 money。如果小於的話,代表本次操作不合法,因此回傳假;反之,我們將 balance[account1 - 1] 減去 money 、 balance[account2 - 1] 加上 money 並回傳真即可。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

相關創作

更多創作