腾讯面试题——拼手气红包真的是拼手气吗?

138 阅读1分钟

一提到红包,就不得不想到微信,没错,这是一道腾讯面试压轴题。 以下就是分析。

前言

每逢春节,家庭群的长辈们都会发红包,有的时候我们都会因为红包最少而气愤言:为什么我的手气那么差!!!其实这不是手气的问题,而是算法的原因。下面就从JavaScript算法来解析为什么手气不好。

拼手气红包的原理

1.随机
2.有金额差,但是不是很大
3.发给多少人,每个人抢到的金额加起来等于总金额

现在开始一步步用代码表示

随机函数,使用JavaScript中自带的Math Math.random(),可以输出0~1中的随机数

//输入//***/来解释代码,严谨性拉满

/**
 * @func 红包算法
 * @param {number} total 总金额 
 * @param {number} num 人数
 */
//定义红包函数
function hongbao(total,num){
const arr=[];
let allMoney = total;
let allNum = num;
}

计算有多少份红包,并且加起来等于总金
额 用浮点型来规范输出的值保留两位小数

for(let i=0;i<num-1;i++){
let money = parseFloat(Math.random() * (allMoney/allNum)).toFixed(2)
allMoney = allMoney-money //每次总金额减少
allNum--;//减少一份
arr.push(money)
//保留最后一个人
}

保存最后一个人的值
按顺序返回每一个红包的钱

arr.push(allMoney.toFixed(2));
return arr;

由代码可以看出来,每一个红包在发的时候就被算法定死了,意思就是,红包会根据已经提前算好的数量,按数组的排序发给抢的顺序。

结语

学会理解,才有收获,题目本不难,难的是怎么去分析和理解,希望各位能够点点赞,给奶茶一点点智齿。