我试图弄清楚如果在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;
}
答案 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;
}
}
}