【面试题相关】

面试的时候被问到:从程序设计角度来说,群发微信红包的时候,每个人领取到的金额跟红包金额对不上的话,有可能代码哪里出现了问题? 我回答要加锁,然后面试官问还有吗??我想不出来了,麻烦请老师解答一下

问题刨析

这是一个范围比较广的问题,但你提供的信息比较少,不知道你有没有深入了解问题,比如将问题展开讨论,会有 n 种结果,我猜想面试官想考察你思考问题是否全面。

所有人红包领取的总额是红包金额吗?

转账系统和红包分发系统出现交互问题。

  • 每个人收到的红包金额与红包分发的金额对应,即张三的红包发到了王五,王五的红包发到了张三:分发系统没问题,转账系统没问题,红包分发系统计算好金额和对象后,在传递给转账系统时,发生了顺序错乱。

  • 每个人收到的红包金额与红包分发的金额不对应,即红包分发金额 4 + 5 + 6 = 15 ,收到的金额 5 + 5 + 5 = 15:分发系统没问题,转账系统出现转账错误问题。

不是

  • 转账系统出现转账错误问题。

老师,您的这个回复不是很看得懂 :joy:问题的假设是红包金额对不上,您回答的第一个是假设相等的情况吗??

问题是每个人领取到的金额跟红包金额对不上,比如:

  • 红包金额:1, 5, 3, 2
  • 领取金额:5, 1, 2, 3

红包金额总合:1+5+3+2 = 11
领取金额总合:5, 1, 2, 3 = 11

老师,我的表述有问题,这个问题应该问的是:群发微信红包的时候,每个人领取到的金额加起来的总数跟红包的总金额对不上,例如,一共发了100块钱,但是全部人抢到的钱加起来不等于100的情况

  • 红包分发算法问题,比如把 100 元分给 6 人,有的人可能没考虑到除不开情况,比如 100//6 = 16,但是 16*6 = 96
  • 加锁方式不对:你加的是线程锁,但程序使用了多进程,锁不生效。
  • 数据类型或精度不匹配,计算出的为 double,但转账系统的传参是 float 或者 int ,造成了精度损失。
  • 没有设计红包的最大转额上限:数据溢出(python 外的语言),转账数额过大造成 int 数据溢出,比如 9999999999999999… 。
  • 没有设计红包的下限:数据过小,精度损失,转账数额太小,造成精度损失,比如 0.9999999999999999999…。
  • 没有设计转账人数上限:转账人数过多,导致服务器压力过大(没有设计负载均衡)或者损失精度,比如同时 999999999… 人抢一个红包。
1 个赞

哇喔,太棒,谢谢老师,膜拜