2016-11-07 54 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