2016-03-20 4 views
1

Это оригинальный запрос:Найти 2D массив макс и мин

Найти максимальное значение и минимальное значение в milesTracker. Назначьте максимальное значение maxMiles и минимальное значение minMiles. Пример выходных данных для данной программы:

Min miles: -10 
Max miles: 40 

Вот мой код:

import java.util.Scanner; 

public class ArraysKeyValue { 
    public static void main (String [] args) { 
    final int NUM_ROWS = 2; 
    final int NUM_COLS = 2; 
    int [][] milesTracker = new int[NUM_ROWS][NUM_COLS]; 
    int i = 0; 
    int j = 0; 
    int maxMiles = 0; 
    int minMiles = 0; 

    milesTracker[0][0] = -10; 
    milesTracker[0][1] = 20; 
    milesTracker[1][0] = 30; 
    milesTracker[1][1] = 40; 

    for(i=0;i<NUM_ROWS;++i) { 

     for(j=0;j<NUM_COLS;++j) { 

      if (milesTracker[i][j]<minMiles){ 
       minMiles = milesTracker[i][j]; 
      } 
      else if (milesTracker[i][j] > maxMiles){ 
       maxMiles = milesTracker[i][j]; 
      } 
     } 
    } 

    System.out.println("Min miles: " + minMiles); 
    System.out.println("Max miles: " + maxMiles); 
    } 
} 

Вот результат:

Testing with milesTracker = {{-10, 20}, {30, 40}} 

Ваш выход:

Min miles: -10 
Max miles: 40 

    Testing with milesTracker = {{73, 0}} 

Ваш выход:

Min miles: 0 
Max miles: 73 

✖ Testing with milesTracker = {{-5}, {-93}, {-259}} 

Ожидаемый результат:

Min miles: -259 
Max miles: -5 

Ваш выход:

Min miles: -259 
Max miles: 0 

Почему последний тест неудачу?

ответ

1

В дополнение к @ ответ Fikolev: если вы только можете редактировать тела цикла, вы можете переместить инициализацию там:

for(i=0;i<NUM_ROWS;++i) { 
    for(j=0;j<NUM_COLS;++j) { 
    if (i == 0 && j == 0) { 
     maxMiles = Integer.MIN_VALUE; 
     minMiles = Integer.MAX_VALUE; 
    } 
    ... 
+0

Где в телах цикла я бы поставил этот фрагмент кода? – java2019

+0

отредактировано, чтобы ответить на этот вопрос – choeger

+0

Теперь он не прошел второй тест – java2019

5

Необходимо инициализировать свои начальные значения по-разному.

int maxMiles = Integer.MIN_VALUE; 
int minMiles = Integer.MAX_VALUE; 

Инициализация их обоих до 0 приводит к проблемам, как вы можете видеть в примере с отрицательными значениями в матрице. Если у вас есть только положительные числа, minMiles останется 0, и будет не так, поскольку вы никогда не получите значение меньше начального 0.

Для minValue вам нужно убедиться, что все, что у вас есть в массиве, меньше начальное значение, поэтому вы назначаете ему максимально возможное значение типа, который вы используете. Для maxValue все наоборот.

Другой возможной ошибкой является состояние else if.

if (milesTracker[i][j] < minMiles) { 
    minMiles = milesTracker[i][j]; 
} else if (milesTracker[i][j] > maxMiles) { 
    maxMiles = milesTracker[i][j]; 
} 

Эти два варианта не являются взаимоисключающими. Что, если вы достигнете числа, которое больше вашего текущего maxMiles и меньше текущего minMiles? Это может произойти, и вы не сможете обновить один из них, в вашем случае - maxMiles.

+0

Единственное место, которое я могу изменить то, где для и вложенными для петель – java2019

+0

Программа не может работать правильно, если вы не можете редактировать исходные значения. Я отредактировал свой ответ, чтобы уточнить. – Filkolev

0

Вот что я использовал.

import java.util.Scanner; 

public class ArraysKeyValue { 
    public static void main (String [] args) { 
     final int NUM_ROWS = 2; 
     final int NUM_COLS = 2; 
     int [][] milesTracker = new int[NUM_ROWS][NUM_COLS]; 
     int i = 0; 
     int j = 0; 
     int maxMiles = 0; // Assign with first element in milesTracker before loop 
     int minMiles = 0; // Assign with first element in milesTracker before loop 

     milesTracker[0][0] = -10; 
     milesTracker[0][1] = 20; 
     milesTracker[1][0] = 30; 
     milesTracker[1][1] = 40; 

     /* Your solution goes here */ 
     for (i = 0; i < NUM_ROWS; i++) { 

     for (j = 0; j < NUM_COLS; j++) { 

      if (i == 0 && j == 0) { 
       maxMiles = milesTracker[i][j]; 
       minMiles = milesTracker[i][j]; 
      } 

       if (milesTracker[i][j] > maxMiles) { 
        maxMiles = milesTracker[i][j]; 
       } 

       else if (milesTracker[i][j] < minMiles) { 
       minMiles = milesTracker[i][j]; 
       } 

      } 

     } 

     System.out.println("Min miles: " + minMiles); 
     System.out.println("Max miles: " + maxMiles); 
    } 
} 
-1

Вставить массив координат, прежде чем начать свои для петель:

EX:

minMiles=milesTracker[0][0]; 
maxMiles=milesTracker[0][0]; 

for(i...){max 
    for(j...){min 
+0

Уже есть ответ, который предлагает инициализировать эти две переменные. Использование очень разумных значений по умолчанию. Ваш ответ не добавляет ничего полезного. – GhostCat

0

Присвоить с первым элементом в milesTracker до того цикла

maxMiles = milesTracker[0][0]; 
minMiles = milesTracker[0][0]; 

for (i = 0; i < NUM_ROWS; i++) {  
    for (j = 0; j < NUM_COLS; j++) { 
     if (milesTracker[i][j] > maxMiles) { 
      maxMiles = milesTracker[i][j];    
     } 
     if (milesTracker[i][j] < minMiles) { 
      minMiles = milesTracker[i][j]; 
     } 
    }  
} 
0

Ответ @Filkolev действительно хорош, но вы можете быть еще короче:

//The solution requires students to initialize max_miles (or maxMiles) or and min_miles (or minMiles) before writing their nested for loop. 
maxMiles = milesTracker[0][0]; 
minMiles = milesTracker[0][0]; 

//loops 
for (i = 0; i <NUM_ROWS; ++i) { 
    for (j = 0; j < NUM_COLS; ++j) { 
     if (milesTracker[i][j] > maxMiles) { 
      maxMiles = milesTracker[i][j]; 
     } 
     else { 
      minMiles = milesTracker[i][j]; 
     } 
    } 
} 
1
for (i = 0; i < NUM_ROWS; i++) { 
    for (j = 0; j < NUM_COLS; j++) { 
     if (i == 0 && j == 0) { 
      maxMiles = milesTracker[i][j]; 
      minMiles = milesTracker[i][j]; 
     } 

     if (milesTracker[i][j] > maxMiles) { 
      maxMiles = milesTracker[i][j]; 
     } 

     else if (milesTracker[i][j] < minMiles) { 
      minMiles = milesTracker[i][j]; 
     } 

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