-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.cpp
More file actions
105 lines (90 loc) · 4.11 KB
/
main.cpp
File metadata and controls
105 lines (90 loc) · 4.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
// Source: https://leetcode.com/problems/simple-bank-system
// Title: Simple Bank System
// Difficulty: Medium
// Author: Mu Yang <http://muyang.pro>
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// You have been tasked with writing a program for a popular bank that will automate all its incoming transactions (transfer, deposit, and withdraw). The bank has `n` accounts numbered from `1` to `n`. The initial balance of each account is stored in a **0-indexed** integer array `balance`, with the `(i + 1)^th` account having an initial balance of `balance[i]`.
//
// Execute all the **valid** transactions. A transaction is **valid** if:
//
// - The given account number(s) are between `1` and `n`, and
// - The amount of money withdrawn or transferred from is **less than or equal** to the balance of the account.
//
// Implement the `Bank` class:
//
// - `Bank(long[] balance)` Initializes the object with the **0-indexed** integer array `balance`.
// - `boolean transfer(int account1, int account2, long money)` Transfers `money` dollars from the account numbered `account1` to the account numbered `account2`. Return `true` if the transaction was successful, `false` otherwise.
// - `boolean deposit(int account, long money)` Deposit `money` dollars into the account numbered `account`. Return `true` if the transaction was successful, `false` otherwise.
// - `boolean withdraw(int account, long money)` Withdraw `money` dollars from the account numbered `account`. Return `true` if the transaction was successful, `false` otherwise.
//
// **Example 1:**
//
// ```
// Input
//
// ["Bank", "withdraw", "transfer", "deposit", "transfer", "withdraw"]
// [[[10, 100, 20, 50, 30]], [3, 10], [5, 1, 20], [5, 20], [3, 4, 15], [10, 50]]
// Output
//
// [null, true, true, true, false, false]
//
// Explanation
//
// Bank bank = new Bank([10, 100, 20, 50, 30]);
// bank.withdraw(3, 10); // return true, account 3 has a balance of $20, so it is valid to withdraw $10.
// // Account 3 has $20 - $10 = $10.
// bank.transfer(5, 1, 20); // return true, account 5 has a balance of $30, so it is valid to transfer $20.
// // Account 5 has $30 - $20 = $10, and account 1 has $10 + $20 = $30.
// bank.deposit(5, 20); // return true, it is valid to deposit $20 to account 5.
// // Account 5 has $10 + $20 = $30.
// bank.transfer(3, 4, 15); // return false, the current balance of account 3 is $10,
// // so it is invalid to transfer $15 from it.
// bank.withdraw(10, 50); // return false, it is invalid because account 10 does not exist.
// ```
//
// **Constraints:**
//
// - `n == balance.length`
// - `1 <= n, account, account1, account2 <= 10^5`
// - `0 <= balance[i], money <= 10^12`
// - At most `10^4` calls will be made to **each** function `transfer`, `deposit`, `withdraw`.
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <vector>
using namespace std;
class Bank {
vector<long long>& balance;
bool validAccount(int account) { //
return 0 <= account && account < balance.size();
}
public:
Bank(vector<long long>& balance) : balance(balance) {}
bool transfer(int account1, int account2, long long money) {
--account1, --account2; // convert to 0-indexed
// Guard
if (!validAccount(account1)) return false;
if (!validAccount(account2)) return false;
if (balance[account1] < money) return false;
// Transaction
balance[account1] -= money;
balance[account2] += money;
return true;
}
bool deposit(int account, long long money) {
--account; // convert to 0-indexed
// Guard
if (!validAccount(account)) return false;
// Transaction
balance[account] += money;
return true;
}
bool withdraw(int account, long long money) {
--account; // convert to 0-indexed
// Guard
if (!validAccount(account)) return false;
if (balance[account] < money) return false;
// Transaction
balance[account] -= money;
return true;
}
};