Как найти второе по величине число в массиве в Java?
Я просто практикую некоторые задания MIT java. Но я не знаю, как найти второе по величине число. http://ocw.csail.mit.edu/f/13
public class Marathon {
public static void main(String[] arguments) {
String[] names = { "Elena", "Thomas", "Hamilton", "Suzie", "Phil",
"Matt", "Alex", "Emma", "John", "James", "Jane", "Emily",
"Daniel", "Neda", "Aaron", "Kate" };
int[] times = { 341, 273, 278, 329, 445, 402, 388, 275, 243, 334, 412,
393, 299, 343, 317, 265 };
for (int i = 0; i < names.length; i++) {
System.out.println(names[i] + ": " + times[i]);
}
System.out.println();
System.out.println("Largest Timing " + Largest(times));
System.out.println();
}
public static int Largest(int[] times) {
int maxValue = times[0];
for (int i = 1; i < times.length; i++) {
if (times[i] > maxValue) {
maxValue = times[i];
}
}
return maxValue;
}
}
8 ответов:
Сортировка массива просто для нахождения статистики порядка слишком расточительна. Вы можете найти второй по величине элемент, следуя алгоритму, который напоминает тот, который у вас уже есть, с дополнительной переменной, представляющей второе по величине число.
В настоящее время Следующий элемент может быть больше Макса или равен/меньше Макса, следовательно, достаточно одного
if:if (times[i] > maxValue) { maxValue = times[i]; }С двумя переменными для рассмотрения, следующий элемент может быть
- больше, чем max - max становится вторым по величине, а следующий элемент становится max
- меньше максимального, но больше второго по величине - следующий элемент становится вторым по величине.
Специальная забота должна быть проявлена о начальном состоянии. Посмотрите на первые два элемента и назначьте больший из них
max, а меньший-второму по величине; начните цикл с элемента номер три, если есть один.Вот как вы можете его закодировать:
if (times[i] > maxValue) { secondLargest = maxValue; maxValue = times[i]; } else if (times[i] > secondLargest) { secondLargest = times[i]; }
Вместо того, чтобы прибегать к сортировке массива, вы можете просто сделать следующее:
- держите a
largestValueи AsecondLargestValue- цикл через весь массив один раз, для каждого элемента:
- проверьте, не превышает ли текущий элемент
largestValue:
- если да, то присвойте
largestValuesecondLargestValue, затем присвойте текущий элементlargestValue(думайте об этом как о сдвиге всего на 1)- Если нет, проверьте, не превышает ли текущий элемент
secondLargestValue
- если да, назначение текущего элемента к
Если нет, ничего не предпринимайте.secondLargestValueO (n) время выполнения
O (1) требование к пространству
Вообще говоря:
Имеют два значения - "самый большой"и " несквит".
Инициализируйте оба в -9999 или что-то еще.
Просмотрите свой список. Если число больше ,чем" самый большой", установите" самый большой " на это число. Но прежде чем вы это сделаете, скопируйте старое" самое большое "значение в "notQuite".
Если, с другой стороны, число меньше, чем "самый большой", но больше, чем "notQuite", установите "notQuite" на это число.
Когда вы закончите изучать все числа, "notQuite" содержит второй по величине.
И обратите внимание, что, когда вы заполняете вышеуказанные числа, вы также можете сохранить "largestIndex" и "notQuiteIndex" и заполнить их соответствующими значениями индекса массива, чтобы вы могли определить "выигрышное" значение. Однако, к сожалению, если существует несколько одинаковых" самых больших "или" второстепенных " значений, простая схема индексации не работает, и вам нужно сохранить какой-то список.
private void secondLargest(int arr[]){ int maxOne=arr[0]; int maxTwo=arr[1]; for(int i=0;i<arr.length;i++){ if(arr[i]>maxOne){ maxTwo=maxOne; maxOne=arr[i]; }else if (arr[i]>maxTwo) { maxTwo=arr[i]; } } System.out.println(maxOne); System.out.println(maxTwo); }
PHP ALGO
Если $arr задан массив
$a = 0; $b = 0; // These are two variables and set their value to minimum $i = 0 ; // this is incremental variable loop $i till count($arr) // loop the array using foreach or for-loop till length of array if( $arr[i] > $a || $arr[i] > $b) ($a < $b) ? $a = $arr[i]: $b = $arr[i] ; // this is conditional operator loop ends echo 'Second largest number is : '. ($a < $b)? $a : $b; // this is conditional operator and you can output the smallest of final two number*объявление переменной и вывод отличаются, но вы можете взять логику из него.
private static int secLargest(int[] numbers) { int maxVal = 0; int nextMaxVal = 0; for (int i = 0; i < numbers.length; i++) { if (numbers[i] > maxVal) { nextMaxVal = maxVal; maxVal = numbers[i]; } if (numbers[i] < maxVal) { nextMaxVal = maxVal; maxVal = numbers[i]; } } return nextMaxVal; }
int largest=time[0]; int secondLargest=largest; for(int i=0;i<time.length;i++){ if(time[i]>largest){ secondLargest=largest; largest=time[i]; } else if(secondLargest<time[i] && time[i]<largest || secondLargest>=largest) secondLargest=time[i]; } return secondLargest;
public void findMax(int a[]) { int large = Integer.MIN_VALUE; int secondLarge = Integer.MIN_VALUE; for (int i = 0; i < a.length; i++) { if (large < a[i]) { secondLarge = large; large = a[i]; } else if (a[i] > secondLarge) { if (a[i] != large) { secondLarge = a[i]; } } } System.out.println("Large number " + large + " Second Large number " + secondLarge); }Приведенный выше код был протестирован с целочисленными массивами, имеющими повторяющиеся записи, отрицательные значения. Наибольшее число и второе по величине число извлекаются за один проход. Этот код не работает только в том случае, если массив содержит только несколько копий одного и того же числа, например {8,8,8,8}, или имеет только одно число.
Comments