如何将数字分为相等的部分或尽可能接近相等的部分。参见下面的示例:
如果我要在两组之间分配的值为61,则该值为30.5和30.5。双精度(十进制)不好,因此在这方面最接近的分隔是30和31。
类似地,42/5 = 8.4,但是我需要系统返回(8、8、8、9、9)这是与整数最接近的拆分。
解决了他们:
if(sum % numberOfTeams != 0) {
al.add(0, sNOT);
for(int i = 0; i < numberOfTeams - 1; i++) {
int remover = sum - sNOT;
if(remover % (sNOT + 1) == 0) {
al.add(i+1, sNOT + 1);
}else {
al.add(i + 1, sNOT);
}
}
}
}
答案 0 :(得分:4)
这是一个完全使用ScrollView
的解决方案,它略短一些,没有循环。有效性检查也应按照上述建议进行
Map<String, Integer> currencyValueMap = new HashMap<>();
for (int i=0; i<denom.length; i++) {
currencyValueMap.put(denom[i], (k, v) v == null ? count[i] : count[i] + v);
}
答案 1 :(得分:3)
这是一种解决方案:
public static int[] closestSplit(int intToSplit, int noOfGroups) {
int[] result = new int[noOfGroups];
Arrays.fill(result, intToSplit / noOfGroups);
for (int i = 0; i < intToSplit % noOfGroups; i++) {
result[i]++;
}
return result;
}
// usage:
System.out.println(Arrays.toString(closestSplit(42, 5)));
基本上,它首先创建一个长度为noOfGroups
的数组,然后用intToSplit
和noOfGroups
的整数除来填充它。接下来,将一个添加到数组的前intToSplit mod noOfGroups
个元素。
如果您要求结果按升序排列,则可以从数组末尾循环或使用Arrays.sort
。
答案 2 :(得分:1)
解决此问题时需要考虑的主要事情是余数。
在上面的示例中,我们打算将61分成2,61 / 2
给出余数 1 。由于我们分为两组,因此这两个组中只有一个必须为((int) 61 / 2) + 1
。其余(一个)组可以是((int) 61 / 2)
。
另外,请考虑将42分为5,42 / 5
得到的余数为 2 。由于我们分为5个组,因此这5个组中只有2个必须为((int) 42 / 5) + 1
。其余(三个)组可以为((int) 42 / 5)
。
代码如下:
public int[] spitNumbers(int number, int groups){
int[] result = new int[groups]; //The array we'd return at the end
int shift = number % groups; //I used this to check the remainder.
for(int i = 0; i < result.length; i++){
/* The if-statement below checks for two things:
- if the remainder is zero
- if we've reached the shifting stage.
*/
if((shift == 0) || (i < shift)){
result[i] = number / groups;
}
// The else statement starts being fired when the shifting stage has been reached.
else{
result[i] = (number / groups) + 1;
}
}
return result;
}
我希望这会有所帮助。.编码愉快!
答案 3 :(得分:-1)
请稍作测试,看看这个解决方案,它可以工作。
public static int[] number(int number, int divider) {
if (number == 0 || number < divider) {
return new int[]{0};
}
if (number == 1 || number == divider) {
return new int[]{1};
}
double r = (double) number / divider;
int upperCount = number % divider;
return IntStream.range(0, divider).map(i ->{
if (i < upperCount) {
return (int) Math.ceil(r);
}
return (int) Math.floor(r);
}).toArray();
}
p.s。简化了