2015-08-15 5 views
0

Цель кода - найти разницу между суммой двух противоположных диагоналей матрицы. Код:Ошибка матрицы диагональной матрицы Java

public static void main(String[] args) { 
    Scanner scn=new Scanner(System.in); 
    int N=scn.nextInt(); 
    int diag1=0; 
    int diag2=0; 
    int[][] matrix=new int[N][N]; 
    for(int i=0; i<N; i++){ 
     for(int j=0; j<N; j++){ 
      matrix[i][j]=scn.nextInt(); 
      System.out.print(" "); 
     } 
     System.out.println(); 
    } 
    for(int i=0; i<N; i++){ 
     for(int j=0; j<N; j++){ 
      if(i==j) 
       diag1+=matrix[i][j]; 
       //System.out.println(diag1); 
     } 
    } 
    int counter1=0, counter2=N-1; 
    for(int i=0; i<N; i++){ 
     for(int j=0; j<N; j++){ 
      if(i==counter1 && j==counter2){ 
       diag2+=matrix[i][j]; 
       counter1++; 
       counter2--; 
      } 

     } 
    } 
    System.out.println(diag1); // used this for checking purpose 
    System.out.println(diag2); // used this for checking purpose 
    System.out.println(Math.abs(diag1-diag2)); 

Я получаю точный результат, но все-таки тест на HackerRank показывает код, как неудачу. Может кто-нибудь объяснить, почему? THe code challenge is mentioned here

У меня есть выход после удаления всех дополнительных заявлений на печать!

ответ

0

Вы печатаете данные, отличные от решения внутри вашего кода. Следовательно, выход не такой же, как у них.

Удалить все System.out.print() и System.out.println() звонки, кроме тех, которые печатают фактический результат.

Несвязанное примечание: для доступа к диагоналям матрицы нет необходимости проходить через все строки и столбцы. Диагонали находятся в очень специфических координатах, поэтому вы должны просто проверить эти координаты. Это сделает ваш код более эффективным.

0

У вас есть некоторые ненужные оператор печати, удалите их

for(int i=0; i<N; i++){ 
     for(int j=0; j<N; j++){ 
      matrix[i][j]=scn.nextInt(); 
      System.out.print(" "); 
     } 
     System.out.println(); 
    } 

Hacker ранга нужна только разница, одно пространство или одна новая линия также считается другой ответ.

Также я предлагаю вам рассчитать обе суммы в одном цикле.

for(int i = 0, j = n - 1; i < n; ++i, j --) 
{ 
    sum1 += a[i][i]; 
    sum2 += a[i][j]; 
    } 
System.out.println(Math.abs(sum1 - sum2)); 
+0

получил выход! просто нужно было удалить пустое пространство и распечатать stmts! – RKiyer

+0

Также оптимизируйте свой код, вот почему вы кодируете hackerrank, вам не нужно O (n^2), когда вы можете сделать это в O (n). Также у вас есть избыточный счетчик1, который точно такой же, как 'i'. –

+0

Спасибо. Тот, который вы опубликовали, выглядит очень эффективным, будет учитывать это в следующий раз. – RKiyer

0

Код, который запускается, должен быть наименьшей сложности и должен печатать точный результат. Следующий код, если он вставлен в hackerrank, даст успех. Также обратите внимание на те тесты, которые дают ошибку, они подсказывают ошибки в коде.

int sum1=0; 
int sum2=0; 

for(int i = 0, j = n - 1; i < n; ++i, j --){ 
    sum1=sum1+a[i][i]; 
    sum2=sum2+a[i][j]; 
} 

System.out.println(abs1(sum1-sum2)); 
0
import java.io.*; 
import java.util.*; 

public class Solution { 

    public static void main(String[] args) {  
     Scanner in = new Scanner(System.in);  
     int n = in.nextInt(); 

     int diognalleft = 0; 
     int diognalright = 0;   
     int [][] array = new int[n][n]; 

     for(int i=0; i<n; i++){ 
      for(int j=0; j<n; j++){ 
        array[i][j]=in.nextInt(); 
      } 
     } 
     for(int i=0; i<n; i++){ 
       for(int j=0; j<n; j++){ 
        if (i == j) 
        { 
         diognalleft = diognalleft + array[i][j]; 
        } 
        if((i+j) == (n-1)) 
        { 
         diognalright = diognalright + array[i][j]; 
        } 
       } 
     } 
     System.out.println(Math.abs(diognalleft - diognalright)); 
    } 
} 
+0

Ответ на отвратительно отформатированный код. Такой ввод не приведет к получению репутации. Пожалуйста: исправьте форматирование и добавьте некоторые пояснения. – GhostCat

Смежные вопросы