1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; namespace ConsoleApplication8 { class Program { static void Main(string[] args) { int[] arr = { 1, 2, 3, 4, 0, 5, 6, 7, 8, 0, 34, 54, 67, 8, 76, 2, 34, 5, 0, 7 }; int min = arr.Min(); int max = arr.Max(); int min_result = (Array.FindAll(arr, delegate(int i) { return i == min; })).Count(); int max_result = (Array.FindAll(arr, delegate(int i) { return i == max; })).Count(); Console.WriteLine("Минимальный элемент в массиве: {0}, их количество: {1}", min, min_result); Console.WriteLine("Максимальный элемент в массиве: {0}, их количество: {1}", max, max_result); Console.ReadLine(); } } } |
dmitrylogvinov, Вы в корне неправильно подходите к обучению. Вам нужно больше времени проводить с учебником и изучать стандартные библиотеки (и в первую очередь — встроенные функции, обращая особое внимание на их параметры), а не пытаться решать задачи «в лоб», раз за разом городя конструкции в стиле Delphi из базового синтаксиса, примерно одинакового для каждого языка. «Батарейки» в Python присутствуют как раз для того, чтобы не изобретать велосипеды.
Задача решается просто и элегантно:
from itertools import count
def lastmax(*sequence):
return max(zip(sequence, count()))
assert lastmax(1, 2, 3) == (3, 2)
assert lastmax(1, 2, 1, 2, 1) == (2, 3)
assert lastmax(1, 2, 3, 4, 5) == (5, 4)
assert lastmax(1, 1, 1, 1, 1) == (1, 4)
Те же самое, но без itertools:
def lastmax(*sequence):
return max(zip(sequence, range(len(sequence))))
Ещё вариант:
from operator import itemgetter
def lastmax(*sequence):
return max(enumerate(sequence), key=itemgetter(1, 0))[::-1]
И ещё:
def lastmax(*sequence):
return max({v: i for i, v in enumerate(sequence)}.items())
Есть и ещё несколько более эзотерических вариантов — например, через heapq.
uses crt; const max=20; var a:array[1..max] of integer; n,i,k:byte; aa,mx:integer; begin clrscr; repeat write('Размер массива n='); readln(n); until n in [1..max]; writeln('Исходный массив:'); for i:=1 to n do begin a[i]:=random(36)-5; write(a[i],' '); end; writeln; writeln; mx:=a[n]; for i:=n downto 1 do if a[i]>mx then mx:=a[i]; writeln('Последний максимальный=',mx); writeln('Максимальные элементы имеют индексы:'); for i:=1 to n do if a[i]=mx then write(i,' '); writeln; write('Введите число для поиска aa='); readln(aa); k:=0; for i:=1 to n do if abs(a[i])>abs(aa) then k:=k+1; write('Количество чисел по модулю больше ',abs(aa),' =',k); readln end.
подскажите как найти наибольший элемент массива после максимального? например при:
[5,5] или [5] - null;
[1,2,3] - 2;
[5,5,4,1] - 4;
[-1,-2,-3,-4,-5,-5] - (-2);
код:
var array = [-1,-2,-3,-4,-5,-5];
function main(array){
max = array[0];
afterMax = null;
for (var i = 0; i < array.length; i++) {
if (max < array[i]) {
afterMax = max;
max = array[i];
}
else if(max != array[i] && afterMax < array[i]){
afterMax = array[i];
}
}
console.log(afterMax);
}
main(array);
задан 9 фев 2016 в 14:45
8
сортируем массив по возрастанию, находим первое максимальное число, слева от него искомое или нет ничего.
function fn(a) {
a = a.slice().sort(function(a, b) {
return a - b
});
return a[a.indexOf(Math.max.apply(null, a)) - 1]
};
alert(fn([-1, -2, -5, -25, -125])); //-2
alert(fn([1, 1, 5, 5])); //1
alert(fn([1, 2, 3, 4, 5, 5])); //4
alert(fn([5, 5])) // undefined;
alert(fn([1, 2, 3])) // 2;
alert(fn([5, 5, 4, 1])) // 4;
alert(fn([-1, -2, -3, -4, -5, -5])) // -2;
ответ дан 9 фев 2016 в 15:00
ронирони
2,2547 серебряных знаков7 бронзовых знаков
Один раз пробежаться по элементам, сохраняя два значения: максимальное и следующее за ним.
function secondMax(a) {
var m0, m1;
for(var i=0; i<a.length; i++) {
if( typeof m0 === 'undefined') {
m0 = a[i];
} else if( m0 < a[i]) {
m1 = m0;
m0 = a[i];
} else if( typeof m1 === 'undefined' && m0 > a[i]) {
m1 = a[i];
} else if( m1 <= a[i] && m0 > a[i]) {
m1 = a[i];
}
}
return m1;
}
var tests = [
[[-1, -2, -5, -25, -125], -2]
,[[1, 1, 5, 5], 1]
,[[1, 2, 3, 4, 5, 5], 4]
,[[5, 5], undefined]
,[[1, 2, 3], 2]
,[[5, 5, 4, 1], 4]
,[[-1, -2, -3, -4, -5, -5], -2]
];
tests.map(function(e){
var result = secondMax(e[0]);
document.body.innerHTML += JSON.stringify(e[0]) + " "
+ (result == e[1] ? "passed" : "failed: " + result) + '<br>';})
ответ дан 9 фев 2016 в 16:46
SergiksSergiks
30.7k4 золотых знака47 серебряных знаков85 бронзовых знаков
1
Пример однострочного решения
Math.max.apply(Math,array.filter(function(el){return el < Math.max.apply(Math,array);}))
Суть: ищем максимальный элемент, фильтруем его, и снова ищем максимум, это и будет требуемое значение.
Что касается вашего вариант, то стоит заменить null
На -Infinity
начальное значение. Правда, тогда нужно будет добавить проверку в конце, чтобы вернуть null
.
И еще одно замечание: использовать локальные переменные max
, aftermax
Еще вариант просто добавить проверку на null
перед сравнением
var array = [-1, -2, -3, -4, -5, -5];
function main(array) {
var max = array[0],
afterMax = null;
for (var i = 0; i < array.length; i++) {
if (max < array[i]) {
afterMax = max;
max = array[i];
} else if (max != array[i] && (afterMax == null || afterMax < array[i])) {
afterMax = array[i];
}
}
console.log(afterMax);
}
main(array);
И еще вариант с reduce
var array = [-1, -2, -3, -4, -5, -5];
function main(array) {
var afterMax = array.reduce(function(acc, cur) {
switch (acc.length) {
case 0:
acc.push(cur);
break;
case 1:
if (acc[0] > cur) acc.push(cur)
else if (acc[0] < cur) acc.unshift(cur);
break;
default:
if (acc[0] < cur) acc.unshift(cur)
else if (acc[0] > cur && acc[1] < cur) acc[1] = curr;
}
return acc;
}, [])[1];
console.log(afterMax);
}
main(array);
ответ дан 9 фев 2016 в 15:07
Grundy♦Grundy
79.9k9 золотых знаков76 серебряных знаков133 бронзовых знака
10
Линейный (кажется) однострочный, ES6.
f=a=>Math.max(...`,${a},`.replace(RegExp(`,${Math.max(...a)}(?=,)`,'g'),'').slice(1,-1).split`,`)
PS: Не надо обращать внимания на этот ответ
ответ дан 9 фев 2016 в 15:34
Qwertiy♦Qwertiy
121k24 золотых знака121 серебряный знак291 бронзовый знак
1
В этом посте будет обсуждаться, как найти минимальный и максимальный элемент в массиве в Java.
1. Использование списка
Если данный массив не является примитивным массивом, мы можем использовать Arrays.asList()
который возвращает список, поддерживаемый массивом. Затем мы вызываем min()
а также max()
методы Collections
class для получения минимального и максимального элементов соответственно. Обратите внимание, что при этом не выполняется фактическое копирование элементов массива.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import java.util.Arrays; import java.util.Collections; import java.util.List; class Main { public static void main(String[] args) { // не примитивный целочисленный массив Integer[] A = { 6, 8, 3, 5, 1, 9 }; List<Integer> ints = Arrays.asList(A); System.out.println(«Min element is « + Collections.min(ints)); System.out.println(«Max element is « + Collections.max(ints)); } } |
Скачать Выполнить код
Для примитивных массивов мы можем использовать Java 8 Stream для преобразования массива в список.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; class Main { public static void main(String[] args) { // примитивный целочисленный массив int[] A = { 6, 8, 3, 5, 1, 9 }; List<Integer> ints = Arrays.stream(A) .boxed() .collect(Collectors.toList()); System.out.println(«Min element is « + Collections.min(ints)); System.out.println(«Max element is « + Collections.max(ints)); } } |
Скачать Выполнить код
2. Использование библиотеки Guava
В библиотеке Guava есть Ints
, Doubles
, Chars
, Longs
и т. д., классы, предлагающие несколько статических служебных методов, относящихся к примитивам, которых еще нет ни в одном из них. Integer
или же Arrays
учебный класс. Чтобы найти минимальный и максимальный элемент, мы можем использовать min()
а также max()
методы соответствующего класса.
import com.google.common.primitives.Ints; class Main { public static void main(String[] args) { int[] A = { 6, 8, 3, 5, 1, 9 }; System.out.println(«Min element is « + Ints.min(A)); System.out.println(«Max element is « + Ints.max(A)); } } |
Скачать код
3. Использование потока Java 8
С появлением Stream в Java 8 мы можем преобразовать массив в поток соответствующего типа, используя метод Arrays.stream()
метод. Тогда мы можем вызвать max()
а также min()
метод, который возвращает максимальный и минимальный элемент этого потока как OptionalInt
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import java.util.Arrays; class Main { public static void main(String[] args) { int[] A = { 6, 8, 3, 5, 1, 9 }; int max = Arrays.stream(A) .max() .getAsInt(); int min = Arrays.stream(A) .min() .getAsInt(); System.out.println(«Min element is « + min); System.out.println(«Max element is « + max); } } |
Скачать Выполнить код
Мы также можем получить поток без использования Arrays.stream()
метод, как показано ниже. Здесь идея состоит в том, чтобы получить поток индексов массива и сопоставить каждый индекс с соответствующим элементом в массиве.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import java.util.stream.IntStream; class Main { public static void main(String[] args) { int[] A = { 6, 8, 3, 5, 1, 9 }; int max = IntStream.range(0, A.length) .map(i -> A[i]) .max() .getAsInt(); int min = IntStream.range(0, A.length) .map(i -> A[i]) .min() .getAsInt(); System.out.println(«Min element is « + min); System.out.println(«Max element is « + max); } } |
Скачать Выполнить код
Наконец, мы можем назвать summaryStatistics()
метод для потока числовых значений, который возвращает IntSummaryStatistics
описывающие различные сводные данные об элементах этого потока. Чтобы получить минимальный и максимальный элемент, вызовите getMin()
а также getMax()
методы на нем.
import java.util.Arrays; import java.util.IntSummaryStatistics; class Main { public static void main(String[] args) { int[] A = { 6, 8, 3, 5, 1, 9 }; IntSummaryStatistics stats = Arrays.stream(A).summaryStatistics(); System.out.println(«Min element is « + stats.getMin()); System.out.println(«Max element is « + stats.getMax()); } } |
Скачать Выполнить код
Это эквивалентно:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import java.util.IntSummaryStatistics; class Main { public static void main(String[] args) { int[] A = { 6, 8, 3, 5, 1, 9 }; IntSummaryStatistics stats = new IntSummaryStatistics(); for (int i : A) { stats.accept(i); } System.out.println(«Min element is « + stats.getMin()); System.out.println(«Max element is « + stats.getMax()); } } |
Скачать Выполнить код
4. Напишите свой собственный служебный метод
Мы также можем написать нашу собственную процедуру для поиска минимального и максимального элемента в массиве, как показано ниже:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
class Main { private static int getMax(int[] A) { int max = Integer.MIN_VALUE; for (int i: A) { max = Math.max(max, i); } return max; } private static int getMin(int[] A) { int min = Integer.MAX_VALUE; for (int i: A) { min = Math.min(min, i); } return min; } public static void main(String[] args) { int[] A = { 6, 8, 3, 5, 1, 9 }; System.out.println(«Min element is « + getMin(A)); System.out.println(«Max element is « + getMax(A)); } } |
Скачать Выполнить код
5. Использование сортировки
Другое решение — отсортировать заданный массив в естественном порядке. Тогда минимальный элемент будет первым элементом, а максимальный — последним элементом массива. Этот параметр не рекомендуется, поскольку время, затрачиваемое процедурой сортировки, не будет линейным, и это также изменяет исходный массив.
import java.util.Arrays; class Main { public static void main(String[] args) { int[] A = { 6, 8, 3, 5, 1, 9 }; Arrays.sort(A); System.out.println(«Min element is « + A[0]); System.out.println(«Max element is « + A[A.length — 1]); } } |
Скачать Выполнить код
Это все о поиске минимального и максимального элементов в массиве в Java.