2016-11-07 59 views
2

我考试中的一个问题是要求编写一些代码来计算2D数组的外部int元素的总和。行的长度和列的长度不一定相等。在Java中整理二维整数数组中的外部元素?

[编辑]角落值不能添加一次以上。

我想出了这个代码,它的工作原理,但我想知道是否有更有效的方法来实现相同的结果。谢谢。

for(int i = 0; i < in.length; i ++) { for(int j = 0; j < in[i].length; j++) { if(i == 0 || i == in.length - 1) { sum += in[i][j]; } else { sum += in[i][in[i].length - 1 ] + in[i][0]; break; } } }

+1

这是O(n + m)无论如何,其中n =行数,m =列数。 –

回答

1

如果我理解你的问题,那么你可以先提取方法来添加一个数组的元素,如

public static int sumArray(int[] in) { 
    int sum = 0; 
    for (int val : in) { 
     sum += val; 
    } 
    return sum; 
} 

然后你就可以像在第一和最后一行添加元素

int sum = sumArray(in[0]) + sumArray(in[in.length - 1]); 

再从其它行的外元件与像

的附加(非嵌套)环
for (int i = 1; i < in.length - 1; i++) { 
    sum += in[i][0] + in[i][in[i].length - 1]; 
} 

或者,在Java 8+,你可能会消除额外的方法和显式循环,并用一个语句不喜欢它

int sum = IntStream.of(in[0]).sum() // 
     + IntStream.of(in[in.length - 1]).sum() // 
     + IntStream.range(1, in.length - 1).map(i -> { 
      return in[i][0] + in[i][in[i].length - 1]; 
     }).sum(); 
+0

问题是获得数组的外部元素的总和。您只使用一维数组。 – denis

+0

我添加第一行,最后一行以及中间每行的第一个和最后一个值(每个2d数组由1d数组组成; * literally *数组数组)。 –

1

是的,你可以更有效地做到这一点。

int row = in.length; 
int column = in[0].length;//not sure of this syntax but trying to get the column size 
int sum = 0; 

for(int j=0;j<column;j++) 
{ 
    sum+=in[0][j]+in[row-1][j]; 
} 
for(int j=1;j<row-1;j++) 
{ 
    sum+=in[j][0]+in[j][column-1]; 
} 

您的解决方案是O(mn),循环遍历不必要的索引。

+1

你已经过去了。角落被计数两次。 –

+0

感谢您的评论。做出改变。 – denis