快手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早都发完了?

#快手##面试题目#
全部评论

相关推荐

点赞 评论 收藏
转发
点赞 评论 收藏
转发
点赞 2 评论
分享
牛客网
牛客企业服务