2015-12-03 3 views
-1

Учитывая массив целых чисел, найдите третье по величине значение в массиве.Результат поиска третьего по величине числа не соответствует

MyApproach

Пример ввода # 1

удалить ({1,2,3,4,5,0,1,2,0,0,2})

Пример выходных данных # 1

{1,2,3,4,5,1,2,2}

Пример ввода # 2

удалить ({0,0,1,2})

Пример выходных данных # 2

{1,2}

Пример ввода # 3

удалить ({0,0 , 0,0})

Пример выходных данных # 3

{}

MyApproach

@Edit

Чтобы найти максимальное число я отсортировали массив и возвращается максимальное число.

Ниже приведен мой код.

Спасибо всем за вашу поддержку.

Ниже мой код:

public int thirdLargest(int[] arr) 
{ 
for(int i=0;i<arr.length;i++) 
{ 
    int temp=0; 
    int large=0; 
    int index=0; 

     large=arr[i]; 
     for(int j=i;j<arr.length;j++) 
     { 
      if(arr[j]>=large) 
      { 
       large=arr[j]; 
       index=j; 
      } 
     } 
     temp=arr[i]; 
     arr[i]=arr[index]; 
     arr[index]=temp; 
} 
return arr[2]; 
} 
+0

@JFPicard Фактический выход и ожидаемый результат, о котором я упомянул в последний раз. –

+1

Не будет ли «третье наибольшее значение» из ваших трех примеров «3», «0» и «null»? – Andreas

+0

@ Andreas Нет, я не думаю. –

ответ

1

Вы могли бы сделать что-то вроде этого:

public static int thirdLargest(int[] array) { 
    int largest = Integer.MIN_VALUE; 
    int secondLargest = Integer.MIN_VALUE; 
    int thirdLargest = Integer.MIN_VALUE; 

    for (int number : array) { 

     if (largest < number) { 
      thirdLargest = secondLargest; 
      secondLargest = largest; 
      largest = number; 
     } else if (secondLargest < number) { 
      thirdLargest = secondLargest; 
      secondLargest = number; 
     } else if (thirdLargest < number) { 
      thirdLargest = number; 
     } 
    } 

    return thirdLargest; 
} 

Испытано с '{-1, -1, -1, -1, -1}' и -1 - вернулся.

Теперь после корректировки коды:

public static int thirdLargest(int[] arr) { 

    int max1 = findMax(arr); 
    int p[] = remove(arr, max1); 
    int max2 = findMax(p); 
    int q[] = remove(p, max2); 
    int max3 = findMax(q); 
    return max3; 
} 

static int findMax(int[] arr) { 
    int max = arr[0]; 
    for (int i = 1; i < arr.length; i++) { 
     if (arr[i] >= max) { 
      max = arr[i]; 

     } 
    } 
    return max; 
} 

static int[] remove(int[] arr, int max) { 
    int index = 0; 
    for (int i = 0; i < arr.length; i++) { 
     if (arr[i] == max) { 
      index = i; 
      break; 
     } 
    } 

    int p[] = new int[arr.length - 1]; 
    for (int m = 0, n = 0; m < arr.length; m++) { 

     if (index != m) { 
      p[n] = arr[m]; 
      n++; 
     } 
    } 
    return p; 

} 

Причины: remove метод должен удалить только один вхождение значения макс.

+0

MyQuestion: Может ли кто-нибудь вести меня, что пошло не так. –

+0

Отредактировал свой ответ. – andrucz

0

Вы не должны удалять данные из массива даешься. Вы запрашиваете вывод 3-го по величине значения, поэтому вы должны выводить и не изменять массив во входном файле вообще. Этот массив можно было бы использовать позже, и можно предположить, что, поскольку вы только находите третий по величине, входной массив останется прежним.

Я бы сделал это, сохранив массив из 3 целых чисел. Целые числа соответствуют самым большим 3 числам, arr[0] является самым большим, arr[1] является вторым по величине, а arr[2] является третьим по величине. Затем прокрутите каждое из чисел на входе и, если оно больше любого из трех чисел, нажмите остальные 2 цифры вниз и вставьте новый номер.

public static int find3rdLargest(int [] arr){ 
    int [] largest3Numbers = {Integer.MIN_VALUE,Integer.MIN_VALUE,Integer.MIN_VALUE}; // Initialize array with minimum int values possible, since we are finding largest 
    for(int i : arr){ // Loop over each item in input 
     if(i > largest3Numbers[0]){ // if its the largest number 
      largest3Numbers[2] = largest3Numbers[1]; // set 2nd largest to 3rd 
      largest3Numbers[1] = largest3Numbers[0]; // set largest to 2nd 
      largest3Numbers[0] = i; // set new largest 
     }else if (i > largest3Numbers[1]){ // if it is the second largest number 
      largest3Numbers[2] = largest3Numbers[1]; // set 2nd largest to 3rd 
      largest3Numbers[1] = i; // set new 2nd largest 
     }else if (i > largest3Numbers[2]){ // if it is the 3rd largest 
      largest3Numbers[2] = i; // set it to 3rd largest 
     } 
    } 
    return largest3Numbers[2]; // return 3rd largest 
} 

Я проверил эту функцию, выполнив:

public static void main(String[] args) throws Exception { 

    int[] shouldOutput4 = { 1,2,3,4,5,6 }; 
    int[] shouldOutput0 = { 0,0,0,0,0,0 }; 
    System.out.println("Should output 4: " + find3rdLargest(shouldOutput4)); 
    System.out.println("Should output 0: " + find3rdLargest(shouldOutput0)); 

} 

Который дал мне выход:

Should output 4: 4 
Should output 0: 0 
+0

Технически второй пример не имеет 3-го по величине числа, поэтому результат должен быть «null» или «Optional.empty()» (Java 8). – Andreas

+0

@Andreas Sir Можете ли вы проверить, что не так в моем коде? –

+0

@Andreas Только вышеуказанный тестовый пример не работает. –

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