假设输入数组的元素按升序排列,如下例所示:
int[] a= {23,24,25,30,34,36,40,41,43,45,50};
我需要将数组拆分为不同的子数组。每个子数组将包含元素,使其总和小于或等于100.
对于上面的输入,我的输出应该是:
b1[]= {23,24,25};
b2[]= {30,34,36};
b3[]= {40,41};
b4[]= {43,45};
b5[]= {50};
输入数组中元素的值和数量可能会有所不同。
我是Java的新手,我完全陷入困境。请建议我继续进行。
答案 0 :(得分:1)
我将为您提供有关如何执行此操作的一些建议,并将编码留给您。如果您对实现的特定位有疑问,请随时询问。
这里你要做的第一件事就是创建一个存放子阵列的地方。既然你不知道你最终会得到多少个子阵列,那么像List
那样动态的东西将是一个不错的选择,但是如果你还没有学到这些,那么一个大阵列可以做到工作也是。
大阵列应该多长时间?那么,每个子阵列都小于100,对吗?您可以将输入中的所有元素相加并除以100以获得估计值。
完成初始设置后,您需要弄清楚如何将输入数组拆分为子数组。你知道子数组的规则是“小于100”,所以你必须做一些补充。
逐个查看输入元素。它们中的每一个都必须以子阵列结束;唯一的问题是何时停止一个子阵列并启动下一个子阵列。因此,如果添加下一个输入数字将使您的子数组总数超过100,则将当前子数组存储在大数组中,并将该输入放入一个全新的子数组中。
当然,加上你之前添加的一堆数字是浪费时间。您可以在侧面保留一个单独的变量来存储当前子阵列的总数,这样您就不必为每个输入添加当前子阵列上的所有元素。记得在创建新的子数组时将该变量重新设置为0!
最后,你可能会在子阵列或大阵列中耗尽空间。如果发生这种情况,只需创建一个大的两倍并复制当前值。
答案 1 :(得分:0)
如果数字的顺序很重要,你可以这样写(这段代码只是打印太阳数组)
int sum = 0;
for(int i=0;i<a.length;i++){
if(sum + a[i] <= 100){
sum += a[i];
System.out.print(a[i]+" ");
}else{
sum = 0;
System.out.println("");
}
}
答案 2 :(得分:0)
你好,这是我能做的最好的......
package test;
import java.util.Arrays;
public class TestArray {
public static void main(String args[]) {
int[] a = { 23, 24, 25, 30, 34, 36, 40, 41, 43, 45, 50};
int[][] b = new int[a.length][];
int aux = 0;
int aIndex = 0;
int bIndex = 0;
for (int i = 0; i < a.length; i++) {
aux += a[i];
if (aux >= 100) {
b[bIndex] = Arrays.copyOfRange(a, aIndex, i);
aux=a[i];
aIndex = i;
bIndex++;
}
}
b[bIndex] = Arrays.copyOfRange(a, aIndex, a.length);
}
}
请记住,我已经创建了一个2D数组而不是b1,b2,b3 ...... 祝你好运,我期待看到更好的解决方案。