基于每个元素的值的总和来拆分数组

时间:2012-10-05 19:56:35

标签: java arrays split sub-array

假设输入数组的元素按升序排列,如下例所示:

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的新手,我完全陷入困境。请建议我继续进行。

3 个答案:

答案 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 ...... 祝你好运,我期待看到更好的解决方案。