面试算法题-随机发红包

2022-02-26  本文已影响0人  M_lear

题意:
有一定金额的红包,随机分给一定数量的人。
约束条件:每个人都有钱,且运气最好的红包金额不能超过总金额的90%。

推荐解法:
把人分成两拨,一拨去分总金额的90%,另一拨人去分总金额的10%。

参考代码:
使用long类型表金额,单位【分】。最小的红包金额为1分。

public class SplitMoney {
    /**
     * 有一定金额的红包,随机发给一定数量的人。要求:运气最好的人不能超过红包总金额的90%,且每个人都有钱
     */

    public static void main(String[] args) {
        System.out.println(new SplitMoney().getMoney(100, 10));
    }

    private List<Long> getMoney(long money, int person) {
        if (money < person) return null;
        long money90 = money*9/10;
        long money10 = money-money90;
        int minGroup = Math.max((int) (Math.min(money10, person)/2*Math.random()), 1);
        List<Long> result = helper(money10, minGroup);
        result.addAll(helper(money90, person-minGroup));
        Collections.shuffle(result);
        return result;
    }

    // money > person
    private List<Long> helper(long money, int person) {
        List<Long> result = new ArrayList<>(person);
        money -= person;
        for (int i = 0; i < person-1; ++i) {
            long m = (long) (money*Math.random());
            result.add(1+m);
            money -= m;
        }

        result.add(1+money);

        return result;
    }
}
上一篇下一篇

猜你喜欢

热点阅读