面试算法题-随机发红包
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;
}
}