快手2面算法题
闲来无事,快手目前面完4轮技术面了,等hr面。想起2轮的时候问了我一道(发红包)题,最后没写出来,这里分享一下。
// 已知,总金额M,总数量N,最大值max,最小值min。求一组整数随机红包? // 假设M=100,N=10,max=13,min=6 // 思路:循环生成随机数。注意每次的随机数条件。 // (1)条件一:这次生成的红包最大值 <= 总余额 - 剩余红包数*最小值。就是说假设发到第9个红包,此时还剩下18元,那么这个红包最大只能是12元,因为第10个红包最小要有6元。 // (2)条件二:这次生成的红包最小值 >= 总余额 - 剩余红包数*最大值。就是说假设发到第9个红包,此时还剩下20元,那么这个红包最小只能是7元,因为第10个红包最大13元。 // (3)另外要注意,上面两个条件要配合最大值和最小值使用,因为我们调整的范围只能是在MAX-MIN之间。 export function generateRedPacket (M, N, MAX, MIN) { const RedPacketArr = new Array(N); let max = MAX; let min = MIN; for (let i = 0; i < N; i++) { if (i === N - 1) { RedPacketArr[i] = M; break; } min = Math.max(M - (N - i - 1) * MAX, MIN); max = Math.min(M - (N - i - 1) * MIN, MAX); const money = parseInt(Math.random() * (max - min + 1)) + min; RedPacketArr[i] = money; M -= money; } return RedPacketArr; }听说快手hc早都发完了?