 
   
    
    
    一、题目
   
    
    
    1、题目描述
   
你的任务是为一个很受欢迎的银行设计一款程序,以自动化执行所有传入的交易(转账,存款和取款)。银行共有
nn
n
个账户,编号从
11
1
到
nn
n
。每个账号的初始余额存储在一个下标从 0 开始的整数数组
balance
中,其中第
(i
+
1
)
(i + 1)
(
i
+
1
)
个账户的初始余额是
balance[i]
。
请你执行所有 有效的 交易。如果满足下面全部条件,则交易 有效 :
指定的账户数量在 1 和 n 之间,且取款或者转账需要的钱的总数 小于或者等于 账户余额。
实现 Bank 类:
Bank(long[] balance)
使用下标从
00
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
。
样例输入:
X
样例输出:
X
    
    
    2、基础框架
   
- C++ 版本给出的基础框架代码如下:
class Bank {
public:
    Bank(vector<long long>& balance) {
    }
    
    bool transfer(int account1, int account2, long long money) {
    }
    
    bool deposit(int account, long long money) {
    }
    
    bool withdraw(int account, long long money) {
    }
};
     
   
    
    
    3、原题链接
   
    
    
    二、解题报告
   
    
    
    1、思路分析
   
    
     
      
       ( 
1
)
        (1)
      
      
       
        
        
        
         (
        
        
         1
        
        
         )
        
       
      
     
    
    首先,存款、取款都得满足范围在
    
     
      
       [ 
1
,
n
]
        [1, n]
      
      
       
        
        
        
         [
        
        
         1
        
        
         ,
        
        
        
        
         n
        
        
         ]
        
       
      
     
    
    。
    
    
     
      
       ( 
2
)
        (2)
      
      
       
        
        
        
         (
        
        
         2
        
        
         )
        
       
      
     
    
    其次,取款、转账的时候满足转账数目小于等于被取款人的当前值。
   
    
    
    2、时间复杂度
   
    每次操作的时间复杂度
    
     
      
       O 
(
1
)
        O(1)
      
      
       
        
        
        
         O
        
        
         (
        
        
         1
        
        
         )
        
       
      
     
    
    。
   
    
    
    3、代码详解
   
class Bank {
    vector<long long> b;
public:
    Bank(vector<long long>& balance) {
        b.clear();
        b.push_back(-1);
        for(int i = 0; i < balance.size(); ++i) {
            b.push_back(balance[i]);
        }
    }
    
    bool transfer(int account1, int account2, long long money) {
        if(account1 > b.size()-1) return false;
        if(account2 > b.size()-1) return false;
        if(withdraw(account1, money) == false) return false;
        return deposit(account2, money);
    }
    
    bool deposit(int account, long long money) {
        if(account > b.size()-1) return false;
        b[account] += money;
        return true;
    }
    
    bool withdraw(int account, long long money) {
        if(account > b.size()-1) return false;
        if(money > b[account]) return false;
        b[account] -= money;
        return true;
    }
};
    
    
    三、本题小知识
   
1、防御式编程
2、充分利用函数进行代码的精简

    
    
    四、加群须知
   
    相信看我文章的大多数都是
    
     
      「 大学生 」
     
    
    ,能上大学的都是
    
     
      「 精英 」
     
    
    ,那么我们自然要
    
     
      「 精益求精 」
     
    
    ,如果你还是
    
     
      「 大一 」
     
    
    ,那么太好了,你拥有大把时间,当然你可以选择
    
     
      「 刷剧 」
     
    
    ,然而,
    
     
      「 学好算法 」
     
    
    ,三年后的你自然
    
     
      「 不能同日而语 」
     
    
    。
    
    那么这里,我整理了
    
     
      「 几十个基础算法 」
     
    
    的分类,点击开启:
   
?《
算法入门指引
》?
如果链接被屏蔽,或者有权限问题,可以私聊作者解决。
     
   
    大致题集一览:
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
     
   
    
    
     
   
    
    
    
    
    
    
    
    
    
    
    为了让这件事情变得有趣,以及
    
     
      「 照顾初学者 」
     
    
    ,目前题目只开放最简单的算法
    
     
      「 枚举系列 」
     
    
    (包括:
    
     线性枚举、双指针、前缀和、二分枚举、三分枚举
    
    ),当有 一半成员刷完
    
     
      「 枚举系列 」
     
    
    的所有题以后,会开放下个章节,等这套题全部刷完,你还在群里,那么你就会成为
    
     
      「 夜深人静写算法 」专家团
     
    
    的一员。
    
    不要小看这个专家团,三年之后,你将会是别人
    
     
      望尘莫及
     
    
    的存在。如果要加入,可以联系我,考虑到大家都是学生,
    
     
      没有「 主要经济来源 」
     
    
    ,在你成为神的路上,
    
     
      「 不会索取任何 」
     
    
    。
    
    ?联系作者,或者扫作者主页二维码加群,加入刷题行列吧?
   
?让天下没有难学的算法?
C语言免费动漫教程,和我一起打卡!
?《
光天化日学C语言
》?
让你养成九天持续刷题的习惯
?《
九日集训
》?
入门级C语言真题汇总
?《
C语言入门100例
》?
组团学习,抱团生长
?《
算法零基础100讲
》?
几张动图学会一种数据结构
?《
画解数据结构
》?
竞赛选手金典图文教程
?《
夜深人静写算法
》?
 
