检查2D整数数组中是否存在一行,该行是同一数组的另外两行的总和

时间:2015-11-18 02:26:42

标签: java

我试图弄清楚如果在2D数组中存在一行是另外两行的总和,我如何编写一个返回true的程序。

我的程序应该做的例子:

如果2D数组是:

2 4 2 3

3 2 6 1

5 6 8 4

9 7 3 7

我的代码应该返回true,因为row [2](第3行)是row [0](第1行)和row [1](第2行)的总和

在我的代码中,我在2D数组的第一列中搜索,以查找值的位置,该值是来自不同行的两个其他值的总和,但无法确定在此之后要执行的操作。

    boolean someRowIsSumOfTwoOthers(int n, int [][] A){ 
        int i, j, k;
        boolean isTotal = false;
        for( i = 0; i < n; i++){
            for(j = 0; j < n; j++){
                if (i != j){        
                    for( k = 0; k < n; k++){
                       if ( (i != k) && (j != k) )  
                            if( A[i][0] == A[j][0] + A[k][0] )
                                isTotal = true;
                                 //once isTotal true, I need to increment column to check if isTotal still true for the rest of that same row
                    }
                }
            }

            if ( (i == n) && isTotal )
                return true;            
        }

        return false;                   
    }

2 个答案:

答案 0 :(得分:1)

为了清楚起见,我觉得值得将问题分成两部分:

boolean rowIsSumOfTwoOthers(int[][] table) {
    int[] sums = sumOfRows(table);
    return oneIsSumOfTwoOthers(sums);
}

使用Java 8流时,每个都相对简单:

private int[] sumOfRows(int[][] table) {
    return IntStream.range(0, table.length)
        .mapToInt(row -> Arrays.stream(table[row]).sum()).toArray();
}

private boolean oneIsSumOfTwoOthers(int[] sums) {
    return IntStream.range(0, sums.length)
        .anyMatch(s1 ->
            IntStream.range(0, sums.length)
            .filter(s2 -> s2 != s1)
            .anyMatch(s2 ->
                IntStream.range(0, sums.length)
                .filter(s3 -> s3 != s1 && s3 != s2)
                .anyMatch(s3 -> sums[s1] == sums[s2] + sums[s3])));
}

答案 1 :(得分:0)

我认为这会给你想要的答案

boolean someRowIsSumOfTwoOthers(int n, int [][] A){ 
    int i, j=0;
    int []rowSums=new int[n];
    boolean isTotal = false;
    //This part cut the code into one deminsion
    //Makes it eaiser to work with
    for(int[] b:A)
    {
        for(i=0;i<b.length;i++)
        {
            rowSums[j]+=b[i];
        }
        //useing j as a row incrimenter
        j++;
    }
    //for the value of one row
    int rowVal;
    //for the value of the other two
    for(int x=0;x<n;x++)
    {
        rowVal=rowSums[x];
        //nested forloop to test any of the other rows combinations
        for(int y=0;y<n;y++)
        {
            //check to keep row values from repeating
            if(y==x)
                y++;
            for(int z=0;z<n;z++)
            {
                //check to keep row values from repeating
                while(z==y || z==x)
                    z++;
                if(z>=n)
                    break;
                if(rowVal==rowSums[z]+rowSums[y])
                    return true;
            }
        }
    }