2016-11-07 3 views
2

Один из вопросов моего экзамена попросил написать код для вычисления суммы внешних элементов int двумерного массива. Длина строк и длина столбцов необязательно равны.Подведение итогов внешних элементов в 2D массиве целых чисел в Java?

[EDIT] Значения углов нельзя добавлять более одного раза.

Я придумал этот код, и он работает, но я хотел бы знать, есть ли более эффективные способы достижения тех же результатов. Благодарю.

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

Я добавляю первую строку, последнюю строку и первое и последнее значение из каждой строки между ними (каждый 2-й массив состоит из 1-го массива, * буквально * массива массивов). –

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