Как найти последний максимальный элемент массива

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

Denis Oleshchenko's user avatar

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

рони's user avatar

ронирони

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

Sergiks's user avatar

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's user avatar

GrundyGrundy

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's user avatar

QwertiyQwertiy

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.

Понравилась статья? Поделить с друзьями:
  • Как составить аннотацию к писателю
  • Как составить номер заказа
  • Jailbreak как найти приложение
  • Как найти людей твитере
  • Как составить квест самостоятельно дома с нуля