美文网首页
面试算法题-随机发红包

面试算法题-随机发红包

作者: M_lear | 来源:发表于2022-02-26 18:52 被阅读0次

    题意:
    有一定金额的红包,随机分给一定数量的人。
    约束条件:每个人都有钱,且运气最好的红包金额不能超过总金额的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;
        }
    }
    

    相关文章

      网友评论

          本文标题:面试算法题-随机发红包

          本文链接:https://www.haomeiwen.com/subject/cqgqrrtx.html