leetcode
leetcode 1801 ~ 1850
简易银行系统

简易银行系统

难度:

标签:

题目描述

代码结果

运行时间: 173 ms, 内存: 44.3 MB


/*
 * Solution using Java Stream
 * The Bank class simulates a simple banking system with functionalities for transferring, depositing, and withdrawing money.
 * In this solution, we use Java Streams for more functional-style processing.
 */
import java.util.Arrays;
import java.util.stream.IntStream;

public class Bank {
    private long[] balance;

    public Bank(long[] balance) {
        this.balance = Arrays.copyOf(balance, balance.length);
    }

    public boolean transfer(int account1, int account2, long money) {
        // Check if both accounts are valid and if account1 has enough balance
        return isValidAccount(account1) && isValidAccount(account2) && balance[account1 - 1] >= money
                && IntStream.of(account1 - 1, account2 - 1)
                           .filter(i -> i >= 0 && i < balance.length)
                           .reduce((acc1, acc2) -> {
                               balance[acc1] -= money;
                               balance[acc2] += money;
                               return acc2;
                           })
                           .isPresent();
    }

    public boolean deposit(int account, long money) {
        // Check if the account is valid
        return isValidAccount(account) && updateBalance(account - 1, money, true);
    }

    public boolean withdraw(int account, long money) {
        // Check if the account is valid and has enough balance
        return isValidAccount(account) && updateBalance(account - 1, money, false);
    }

    private boolean isValidAccount(int account) {
        return account > 0 && account <= balance.length;
    }

    private boolean updateBalance(int account, long money, boolean deposit) {
        if (deposit) {
            balance[account] += money;
        } else if (balance[account] >= money) {
            balance[account] -= money;
            return true;
        }
        return deposit;
    }
}

解释

方法:

该题解实现了一个简易的银行系统,包括初始化账户余额、转账、存款和取款功能。构造函数初始化银行系统的账户余额。转账函数检查账户有效性和余额后进行金额转移。存款函数只检查账户有效性后增加余额。取款函数则检查账户有效性和余额后进行扣款。

时间复杂度:

O(1)

空间复杂度:

O(n)

代码细节讲解

🦆
在`Bank`类的方法中,如何处理并发调用的情况?例如,同时从一个账户进行转账和取款。
在当前的`Bank`类实现中,并没有处理并发调用的机制,这可能导致数据不一致的问题,例如竞争条件。为了处理并发调用,可以使用锁(如互斥锁)来同步对共享数据(这里是账户余额)的访问。在每个方法开始时加锁,并在操作完成后释放锁,这样可以确保在任一时间点,只有一个线程可以修改账户的余额,从而保证操作的原子性和数据的一致性。
🦆
为什么在转账、存款和取款方法中,账户编号的有效性检查是首先执行的?是否有特定的原因确保这种顺序?
在操作账户余额之前首先检查账户编号的有效性是至关重要的,因为这样可以防止对不存在的账户进行操作,避免数组越界等错误。这种顺序确保了程序的健壮性和数据安全,避免了后续操作可能引发的错误或异常。
🦆
在`transfer`方法中,如果在扣除`account1`余额后程序异常退出,如何确保数据的一致性?
为了确保数据的一致性,可以实现事务管理机制。在转账操作开始前,可以记录相关账户的原始状态。如果在转账过程中发生异常,系统可以利用这些记录来回滚到原始状态。另外,也可以考虑使用数据库事务或其他支持原子操作的持久化存储方法,这些方法内置了处理异常和恢复数据一致性的机制。
🦆
在执行操作前对账户余额进行检查,但是否存在某些边界条件下未被考虑的情况?例如账户余额正好等于转账金额。
在题解中,如果账户余额正好等于转账金额,这种边界条件是被考虑的。在转账方法中,检查了如果`account1`的余额小于转账金额则返回`False`,否则允许转账。因此,当余额等于转账金额时,转账是被允许的。这是符合逻辑和预期的行为。

相关问题