设计题:抢红包

一道关于设计红包分配算法的题目,将总额num的红包分给people个人,确保每个人不拿空红包且红包金额有差异。通过将人数视为线段,随机选择不重复的点作为分割,转化为划分线段问题。红包发出后,存储于数据结构中,抢红包线程互斥取出。考虑到精度,使用整数计算后转换为浮点数。准备阶段包括扩大总额、生成随机点并排序,抢红包时根据顺序获取红包金额,但红包大小与顺序无关。
摘要由CSDN通过智能技术生成

复习时遇到的一道设计题,感觉挺有意思的。

总额为num的红包,分给若干个人,要求每个人不能抢到空的红包,每个红包的金额不能过于接近,应该有大有小。

一个不错的思路:将人数people看作是people个线段,那么我们只需要在线段上随机选出people-1个不重复的点,最后将这people-1个点以及首尾两个哨兵端点看作一条线,计算每个相邻点之间的距离就对应红包的大小——总额为num看作长度为num的线段,分红包问题转换为划分线段的问题。
当发红包的发出红包之后,这个红包就经过一次“分割算法”将若干个包存入数据结构中,而抢红包的线程其实就是互斥的取出红包即可。

这里做一个限定:红包的发出金额应该是一个整数,红包大小和总金额最大保留到两位小数,而且人数也是整数,单个红包也不能低于0.01元,其他的一些校验能省则省了。

由于浮点数自身存储的就是一个近似值,因此为了计算准确性,我们先使用整型进行计算,最后对结果除以100.00转换为浮点数

double[] fun(int people,int num)

准备工作:num扩大100倍、待填充的端点数组、产生随机数的对象、用于去重的端点数组

        num*=100;
        if(num/people<1)throw new IllegalStateException("至少每个人也要有一分钱吧!"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值