问题:当前要开发一个微信红包功能,用户需要能创建一个大红包,设定总金额和单个红包最大最小金额,发到群里让大家点击抢红包,抢完即止,问如何设计才能确保红包可以被分完?
以
下
是
防
止
泄
密
的
保
护
区
|
|
|
|
|
|
|
好,开始解题。
假设总金额是sum,最大金额是max,最小金额是min,红包需要用户选择创建后,在后端一次性生成所有小红包,而不是通过抢红包的人一次点击才生成一次(这点很重要)。
之后通过将· 限定最大最小金额生成随机数方法·作为迭代器去生成小红包,直到总金额被消耗殆尽。
其中最关键的就是避开可能导致剩余金额无法满足生成最小值红包的情况。
代码如下:
// 生成红包
function generateBaobao(sum: number, max: number, min: number) {
let moneyArr = [];
if (sum < min || max < min || (sum % min !== 0 && sum % min > max - min)) {
throw new Error("提供的总金额、最大值、最小值组成无法生成红包");
}
while(sum > min) {
// 通过判断,避开了生成红包后剩余金额不满足最小值要求的情况。
if (sum % min === 0 && sum % max <= min) {
moneyArr.push(min);
sum -= min;
break;
}
if (sum < max + min) {
if (sum <= max) {
moneyArr.push(sum);
} else {
moneyArr.push(min, sum - min);
}
sum = 0;
break;
}
const nextMoney = Math.floor(Math.random() * (max - min) + min);
sum -= nextMoney;
moneyArr.push(nextMoney);
}
return moneyArr;
}
理解后,接下来是第二题,依旧是上述条件和要求,但是增加多一个要求,要根据当前微信群的人数,确保生成的红包数量可以被分完,应该如何处理?
这一题我就不说答案了,留给大家自行思考吧。