2043. 简易银行系统

自动化银行账户交易系统设计与实现

题目描述.

设计一个程序,实现一个银行账户系统,能够自动处理一系列传入的交易操作,具体包括转账、存款和取款。银行有 n 个账户,账户编号从 1n。每个账户的初始余额通过一个整数数组 balance 给出,balance[i] 表示第 i+1 个账户的余额。

需要实现如下功能:

  • 转账:从账户 account1 向账户 account2 转账 money 美元。
  • 存款:向指定账户存入 money 美元。
  • 取款:从指定账户取出 money 美元。

交易只有在满足以下条件时有效:

  1. 账户编号必须在有效范围 [1, n] 内。
  2. 取款或转账时,账户余额必须足够支付对应金额。

如果交易有效,则执行交易并返回 true;否则不执行并返回 false


解题分析

这个问题核心是模拟银行账户操作,主要难点包括:

  • 账户编号从 1 开始,而余额数组下标从 0 开始,使用时需要做索引转换。
  • 交易有效性判断,尤其是余额是否足够。
  • 高效支持大量交易请求,要求各操作时间复杂度为 O(1)。

题目不涉及并发或者复杂的数据结构,主要是正确性和边界条件的判断。


解题方法

用一个数组 balance 保存每个账户的余额,账户编号 account 对应的余额索引是 account - 1

  • 初始化时直接将传入的余额数组保存。
  • 存款操作只需验证账户编号有效即可,直接给余额加钱。
  • 取款操作要先验证账户编号和余额是否充足,余额足够则扣款。
  • 转账操作类似取款,先检查两个账户是否有效,再检查转出账户余额是否够,满足条件则扣款并给收款账户加钱。

对账户有效性的判断封装成一个私有函数 _is_valid(account),代码清晰且易维护。


Python 实现代码

from typing import List

class Bank:

    def __init__(self, balance: List[int]):
        """初始化银行账户余额"""
        self.balance = balance

    def transfer(self, account1: int, account2: int, money: int) -> bool:
        """从 account1 转账 money 到 account2"""
        if not self._is_valid(account1) or not self._is_valid(account2):
            return False
        if self.balance[account1 - 1] < money:
            return False
        self.balance[account1 - 1] -= money
        self.balance[account2 - 1] += money
        return True

    def deposit(self, account: int, money: int) -> bool:
        """向 account 存款 money"""
        if not self._is_valid(account):
            return False
        self.balance[account - 1] += money
        return True

    def withdraw(self, account: int, money: int) -> bool:
        """从 account 取款 money"""
        if not self._is_valid(account):
            return False
        if self.balance[account - 1] < money:
            return False
        self.balance[account - 1] -= money
        return True

    def _is_valid(self, account: int) -> bool:
        """判断账户编号是否有效"""
        return 1 <= account <= len(self.balance)

示例说明

下面是题目中给出的示例操作:

bank = Bank([10, 100, 20, 50, 30])

print(bank.withdraw(3, 10))    # True,账户3余额20,取出10后余额10
print(bank.transfer(5, 1, 20)) # True,账户5余额30,转出20,账户1余额变30
print(bank.deposit(5, 20))     # True,账户5余额10+20=30
print(bank.transfer(3, 4, 15)) # False,账户3余额10,不足转账15
print(bank.withdraw(10, 50))   # False,账户10不存在

输出符合预期,说明代码正确处理了账户边界和余额条件。


复杂度分析

  • 初始化时复杂度为 O(n),拷贝余额数组。
  • transferdepositwithdraw 三个操作均为 O(1) 时间复杂度,满足题目对大量调用的要求。
  • 空间复杂度为 O(n),存储账户余额。

方案比较与总结

这道题的关键是模拟,数据结构使用数组最简洁高效。也可以用哈希表映射账户编号到余额,但题目账户编号连续且从1开始,数组更加合适。

在多线程并发场景中,需加锁保证余额操作的原子性,但题目未涉及并发。

该实现结构清晰,代码简洁,边界判断完善,能够正确高效处理各种交易请求。


拓展思考

  • 如何支持账户冻结、限额或手续费?
  • 如何设计支持多币种账户?
  • 如何记录每笔交易流水,支持查询和回滚?
  • 如何防止并发环境下的资金安全问题?

这些都是实际银行系统设计中常见的更复杂场景。


结语

本篇文章详细介绍了一个银行账户交易系统的设计与实现方法,涵盖题目分析、代码实现、示例测试及复杂度分析。通过这道题,可以掌握模拟题的思路和细节处理能力。希望对你学习系统设计和算法实现有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值