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

Можете просто примерно написать как думать, а то вообще идей нет

Total Pusher's user avatar

задан 6 окт 2019 в 6:26

Forer's user avatar

2

first_max = int(input())
second_max = int(input())
if first_max < second_max:
    first_max, second_max = second_max, first_max
element = int(input())
while element != 0:
    if element > first_max:
        second_max, first_max = first_max, element
    elif element > second_max:
        second_max = element
    element = int(input())
print(second_max)

ответ дан 6 окт 2019 в 6:27

Андрей Крузлик's user avatar

Андрей КрузликАндрей Крузлик

1,2633 золотых знака11 серебряных знаков17 бронзовых знаков

Пожалуй эффективнее всего будет воспользоваться функцией heapq.nlargest():

from heapq import nlargest

res = nlargest(2, items)[1]

ответ дан 6 окт 2019 в 7:14

MaxU - stand with Ukraine's user avatar

Можно написать функцию:

def find_maxes(array, count):
    # копируем список чтобы не изменить старую
    copied_array = array.copy()
    maximums = []
    if count > len(copied_array):
        raise ValueError('Количество не может превышать длину списка')
    for _ in range(count):
        max_val = max(copied_array)  # получаем максимальное значение
        copied_array.remove(copied_array)  # удаляем его из списка
        maximums.append(max_val)  # добавляем в наш ожидаемый результат
    return maximums

или же можно поступить хитро

def find_maxes(array, count):
    if count > len(array):
        raise ValueError('Количество не может превышать длину списка')
    sorted_array = sorted(array)  # отсортировать список
    # Забрать последние элементы из спика так как они будут максимальными
    return sorted_array[len(array)-count: len(array)]

ответ дан 6 окт 2019 в 6:44

E1mir's user avatar

E1mirE1mir

1,89811 серебряных знаков23 бронзовых знака

2

b=[3,5,6,7,7,7]

print(list(set(b))[-2])

функция set позволит создать множество отсортированных по возрастанию отличных друг от друга чисел, функция list позволит создать список и обратиться к предпоследнему (или -2) элементу.

<<6

ответ дан 29 окт 2020 в 21:37

FeToR's user avatar

FeToRFeToR

12 бронзовых знака

HateLov

0 / 0 / 0

Регистрация: 22.10.2018

Сообщений: 42

1

Найти второй максимум в последовательности чисел

08.01.2019, 20:34. Показов 22590. Ответов 62

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Дана последовательность целых чисел, оканчивающаяся нулём. Необходимо найти число, наиболее близкое к максимальному по величине числу в этой последовательности (второй максимум). Ноль числом последовательности не считается.

Формат входных данных

Вводится не более чем 215 целых чисел, каждое из которых не превосходит по модулю 215−1. После последнего числа вводится Гарантируется, что последовательность содержит хотя бы два элемента.

Формат выходных данных

Требуется вывести искомое число.

Не могу понять, почему не получается:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
using namespace std;
 
int main()
{
    signed short int max1 = 0, max2 = 0, n = 1;
 
    while (n != 0) {
        cin >> n;
        if (n >= max1){
            max2 = max1;
            max1 = n;
        }
    }
    cout << max2;
    return 0;
}

Помогите пожалуйста!



0



447 / 333 / 172

Регистрация: 01.07.2015

Сообщений: 1,162

08.01.2019, 20:50

2

Цитата
Сообщение от HateLov
Посмотреть сообщение

Не могу понять, почему не получается:

Потому что если условие выполняется всего один раз, то max2 будет всегда 0



1



0 / 0 / 0

Регистрация: 22.10.2018

Сообщений: 42

08.01.2019, 20:55

 [ТС]

3

А как исправить?



0



447 / 333 / 172

Регистрация: 01.07.2015

Сообщений: 1,162

08.01.2019, 20:58

4

Цитата
Сообщение от HateLov
Посмотреть сообщение

А как исправить?

закинуть последовательность в какой-нибудь вектор или сет, а потом найти второй максимум путем сортировки в случае вектора

см. ссылки внизу



0



0 / 0 / 0

Регистрация: 22.10.2018

Сообщений: 42

08.01.2019, 22:14

 [ТС]

5

Я новичок. Для меня всё это непонятно. Мне просто нужно, что кто – нибудь написал, как правильно, а я сама разберусь дальше в понимании…



0



7427 / 5021 / 2891

Регистрация: 18.12.2017

Сообщений: 15,694

08.01.2019, 22:30

6

HateLov, Найти два наибольших числа в последовательности см. первый пост от Hitoku.
только Вам ещё нужно будет сделать ограничение на ввод <=215 и вот это напишите что имеется ввиду:

Цитата
Сообщение от HateLov
Посмотреть сообщение

по модулю 215−1



0



Skyer

78 / 62 / 47

Регистрация: 05.05.2013

Сообщений: 196

08.01.2019, 22:35

7

Вам необходимо рассмотреть случай, когда очередное число не больше первого максимума, но больше второго максимума

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
using namespace std;
 
int main()
{
    int n, k, max1 = 0, max2 = 0;
    cin >> n;
 
    for(int i = 0; i < n; i++) {
        cin >> k;
        if (k >= max1){
            max2 = max1;
            max1 = k;
        }
        else if (k > max2)
            max2= k ;
    }
    cout << max2;
    return 0;
}



0



7427 / 5021 / 2891

Регистрация: 18.12.2017

Сообщений: 15,694

08.01.2019, 22:42

8

Skyer, Ваш вариант не работает:
3
2 2 1
OUTPUT:
2



0



78 / 62 / 47

Регистрация: 05.05.2013

Сообщений: 196

08.01.2019, 22:46

9

Это как посмотреть. Если массив отсортировать по убыванию, то на втором месте будет 2. в вашем случае можно в первом условии поставить >=



0



0 / 0 / 0

Регистрация: 22.10.2018

Сообщений: 42

08.01.2019, 22:48

 [ТС]

10

Ввод:
13
42
6
0
Вывод:
13
__________________
Не работает. И можно это без for сделать, а с while?



0



ReDoX

447 / 333 / 172

Регистрация: 01.07.2015

Сообщений: 1,162

08.01.2019, 22:50

11

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <algorithm>
#include <iostream>
#include <vector>
 
using namespace std;
 
int main() {
  int n = 1;
 
  vector<int> a;
 
  while (n != 0) {
    cin >> n;
 
    a.push_back(n);
  }
 
  sort(a.begin(), a.end());
 
  cout << a[a.size() - 2];
}



0



78 / 62 / 47

Регистрация: 05.05.2013

Сообщений: 196

08.01.2019, 22:51

12

HateLov, В вашем примере покажите мне число, которое ближе к 42, чем 13? С while можно, достаточно вводить значения пока очередное k не станет нулем



0



0 / 0 / 0

Регистрация: 22.10.2018

Сообщений: 42

08.01.2019, 22:52

 [ТС]

13

Блин, ну не проходили мы ещё такого. Можно это более проще решить? Я всем вам благодарна, но я просто хочу понять, как написать правильно тем способом, который мы проходим…



0



7427 / 5021 / 2891

Регистрация: 18.12.2017

Сообщений: 15,694

08.01.2019, 22:53

14

Цитата
Сообщение от Skyer
Посмотреть сообщение

Это как посмотреть.

согласитесь, что ответ: наиболее близкое к 2 это число 2 как-то не очень.

Цитата
Сообщение от Skyer
Посмотреть сообщение

можно в первом условии поставить >=

а разве у Вас в первом условии не >=?



0



78 / 62 / 47

Регистрация: 05.05.2013

Сообщений: 196

08.01.2019, 22:53

15

ReDoX, из пушки по воробьям бьете))) школьная задачка же



0



447 / 333 / 172

Регистрация: 01.07.2015

Сообщений: 1,162

08.01.2019, 22:54

16

Цитата
Сообщение от Yetty
Посмотреть сообщение

согласитесь, что ответ: наиболее близкое к 2 это число 2 как-то не очень.

Не по теме:

и правда чушь какая-то, значит мой код тоже неправильный



0



Skyer

78 / 62 / 47

Регистрация: 05.05.2013

Сообщений: 196

08.01.2019, 22:56

17

Как-то так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
using namespace std;
 
int main()
{
    int n, k, max1 = 0, max2 = 0;
    cin >> k;
 
    while (K != 0) {
 
        if (k > max1){
            max2 = max1;
            max1 = k;
        }
        else if (k > max2 && k != max1)
            max2= k ;
        cin >> k;
    }
    cout << max2;
    return 0;
}

Yetty, вы правы, не заметил



0



447 / 333 / 172

Регистрация: 01.07.2015

Сообщений: 1,162

08.01.2019, 23:00

18

Цитата
Сообщение от Skyer
Посмотреть сообщение

Как-то так

А если ввести 2 2 2 0, то выведет 0, но ведь ближайшее значение к 2 – 2, нет? Или я чего-то не понял?



0



7427 / 5021 / 2891

Регистрация: 18.12.2017

Сообщений: 15,694

08.01.2019, 23:02

19

Skyer, для последовательности целых чисел нельзя за первый max брать max=0 (будет работать неправильно)



0



78 / 62 / 47

Регистрация: 05.05.2013

Сообщений: 196

08.01.2019, 23:04

20

ReDoX, это вопрос трактования условия задачи. Надо уточнять что именно преподаватель понимает под вторым максимумом. в моей практике были разные случаи

Добавлено через 1 минуту
Yetty, согласен. Надо взять -1. Я почему-то посчитал, что числа положительные



0



Skip to content

Задача «Второй максимум»

Условие

Последовательность состоит из различных натуральных чисел и завершается числом 0. Определите значение второго по величине элемента в этой последовательности. Гарантируется, что в последовательности есть хотя бы два элемента.

Решение задачи от разработчиков на Python:

Другая реализация задачи на Python:

Смотреть видео — Задача «Второй максимум» решение на Python

Делитесь с друзьями ссылкой на ответ и задавайте вопросы в комментариях! 👇

Related Posts

Посмотреть все комментарии

wpDiscuz

0

Оставьте комментарий! Напишите, что думаете по поводу статьи.x

Is it possible to find the second maximum number from an array of integers by traversing the array only once?

As an example, I have a array of five integers from which I want to find second maximum number. Here is an attempt I gave in the interview:

#define MIN -1
int main()
{
    int max=MIN,second_max=MIN;
    int arr[6]={0,1,2,3,4,5};
    for(int i=0;i<5;i++){
        cout<<"::"<<arr[i];
    }
    for(int i=0;i<5;i++){
        if(arr[i]>max){
            second_max=max;
            max=arr[i];          
        }
    }
    cout<<endl<<"Second Max:"<<second_max;
    int i;
    cin>>i;
    return 0;
}

The interviewer, however, came up with the test case int arr[6]={5,4,3,2,1,0};, which prevents it from going to the if condition the second time.
I said to the interviewer that the only way would be to parse the array two times (two for loops). Does anybody have a better solution?

codaddict's user avatar

codaddict

443k81 gold badges490 silver badges528 bronze badges

asked Mar 6, 2010 at 14:03

Xinus's user avatar

2

Your initialization of max and second_max to -1 is flawed. What if the array has values like {-2,-3,-4}?

What you can do instead is to take the first 2 elements of the array (assuming the array has at least 2 elements), compare them, assign the smaller one to second_max and the larger one to max:

if(arr[0] > arr[1]) {
 second_max = arr[1];
 max = arr[0];
} else {
 second_max = arr[0];
 max = arr[1];
}

Then start comparing from the 3rd element and update max and/or second_max as needed:

for(int i = 2; i < arr_len; i++){
    // use >= n not just > as max and second_max can hav same value. Ex:{1,2,3,3}   
    if(arr[i] >= max){  
        second_max=max;
        max=arr[i];          
    }
    else if(arr[i] > second_max){
        second_max=arr[i];
    }
}

answered Mar 6, 2010 at 14:15

codaddict's user avatar

codaddictcodaddict

443k81 gold badges490 silver badges528 bronze badges

4

The easiest solution would be to use std::nth_element.

answered Mar 6, 2010 at 14:06

avakar's user avatar

avakaravakar

31.8k9 gold badges65 silver badges102 bronze badges

9

You need a second test:

 for(int i=0;i<5;i++){  
   if(arr[i]>max){  
     second_max=max;  
     max=arr[i];            
   }
   else if (arr[i] > second_max && arr[i] != max){
     second_max = arr[i];
   }
 }

answered Mar 6, 2010 at 14:08

Anders Abel's user avatar

Anders AbelAnders Abel

67.7k17 gold badges150 silver badges217 bronze badges

3

Your original code is okay, you just have to initialize the max and second_max variables. Use the first two elements in the array.

answered Mar 6, 2010 at 14:34

Hans Passant's user avatar

Hans PassantHans Passant

917k145 gold badges1680 silver badges2521 bronze badges

Here you are:

std::pair<int, int> GetTwoBiggestNumbers(const std::vector<int>& array)
{
    std::pair<int, int> biggest;
    biggest.first = std::max(array[0], array[1]);  // Biggest of the first two.
    biggest.second = std::min(array[0], array[1]); // Smallest of the first two.

    // Continue with the third.
    for(std::vector<int>::const_iterator it = array.begin() + 2;
        it != array.end();
        ++it)
    {
        if(*it > biggest.first)
        {
            biggest.second = biggest.first;
            biggest.first = *it;
        }
        else if(*it > biggest.second)
        {
            biggest.second = *it;
        }
    }

    return biggest;
}

answered Mar 6, 2010 at 14:14

Johann Gerell's user avatar

Johann GerellJohann Gerell

24.8k10 gold badges71 silver badges122 bronze badges

7

Quickselect is the way to go with this one. Pseudo code is available at that link so I shall just explain the overall algorithm:

QuickSelect for kth largest number:
    Select a pivot element
    Split array around pivot
    If (k < new pivot index)
       perform quickselect on left hand sub array
     else if (k > new pivot index)
       perform quickselect on right hand sub array (make sure to offset k by size of lefthand array + 1)
     else
       return pivot

This is quite obviously based on the good old quicksort algorithm.

Following this algorithm through, always selecting element zero as the pivot every time:

select 4th largest number:
1) array = {1, 3, 2, 7, 11, 0, -4}
partition with 1 as pivot
{0, -4, _1_, 3, 2, 7, 11}
4 > 2 (new pivot index) so...

2) Select 1st (4 - 3) largest number from right sub array
array = {3, 2, 7, 11}
partition with 3 as pivot
{2, _3_, 7, 11}
1 < 2 (new pivot index) so...

3) select 1st largest number from left sub array
array = {2}

4) Done, 4th largest number is 2

This will leave your array in an undefined order afterwards, it’s up to you if that’s a problem.

answered Mar 6, 2010 at 18:09

Martin's user avatar

MartinMartin

12.4k12 gold badges63 silver badges128 bronze badges

Step 1. Decide on first two numbers.
Step 2. Loop through remaining numbers.
Step 3. Maintain latest maximum and second maximum.
Step 4. When updating second maximum, be aware that you are not making maximum and second maximum equal.

Tested for sorted input (ascending and descending), random input, input having duplicates, works fine.

#include <iostream>
#define MAX 50
int GetSecondMaximum(int* data, unsigned int size)
{
    int max, secmax;
    // Decide on first two numbers
    if (data[0] > data[1])
    {
        max = data[0];
        secmax = data[1];
    }
    else
    {
        secmax = data[0];
        max = data[1];
    }
    // Loop through remaining numbers
    for (unsigned int i = 2; i < size; ++i)
    {
        if (data[i] > max)
        {
            secmax = max;
            max = data[i];
        }
        else if (data[i] > secmax && data[i] != max/*removes duplicate problem*/)
            secmax = data[i];
    }
    return secmax;
}
int main()
{
    int data[MAX];
    // Fill with random integers
    for (unsigned int i = 0; i < MAX; ++i)
    {
        data[i] = rand() % MAX;
        std::cout << "[" << data[i] << "] "; // Display input
    }
    std::cout << std::endl << std::endl;
    // Find second maximum
    int nSecondMax = GetSecondMaximum(data, MAX);
    // Display output
    std::cout << "Second Maximum = " << nSecondMax << std::endl;
    // Wait for user input
    std::cin.get();
    return 0;
}

answered Mar 6, 2010 at 18:39

Rajendra Uppal's user avatar

Rajendra UppalRajendra Uppal

18.9k15 gold badges59 silver badges57 bronze badges

Other way to solve this problem, is to use comparisons among the elements. Like for example,

a[10] = {1,2,3,4,5,6,7,8,9,10}

Compare 1,2 and say max = 2 and second max = 1

Now compare 3 and 4 and compare the greatest of them with max.

if element > max
     second max = max
     element = max
else if element > second max
     second max = element

The advantage with this is, you are eliminating two numbers in just two comparisons.

Let me know, if you have any problem understanding this.

answered Mar 7, 2010 at 6:19

Boolean's user avatar

BooleanBoolean

14.2k30 gold badges88 silver badges129 bronze badges

1

Check this solution.

max1 = a[0];
max2 = a[1];

for (i = 1; i < n; i++)
{
    if (max1 < a[i])
    {
        max2 = max1;
        max1 = a[i];
    }

    if (max2 == max1) max2 = a[i + 1];

    if (max2 == a[n])
    {
        printf("All numbers are the same no second max.n");
        return 0;
    }

    if (max2 < a[i] && max1 != a[i]) max2 = a[i];
}

Mario S's user avatar

Mario S

11.7k24 gold badges38 silver badges47 bronze badges

answered Oct 16, 2011 at 20:11

mitta's user avatar

mittamitta

111 bronze badge

1

Here is something which may work ,

public static int secondLargest(int[] a){
    int max=0;
    int secondMax=0;

    for(int i=0;i<a.length;i++){
        if(a[i]<max){
            if(a[i]>secondMax){
                secondMax=a[i];
            }
            continue;
        }

        if(a[i]>max){
            secondMax=max;
            max=a[i];
        }

    }
    return secondMax;
}

Kevin's user avatar

Kevin

53.3k15 gold badges99 silver badges130 bronze badges

answered Nov 26, 2011 at 18:03

nikhil's user avatar

The upper bound should have be n+log2⁡n−2, but it bigger than O(n) in case of random selection algorithm, but in worst case it much smaller. The solution might be

  1. build a tree like to find the MAX element with n – 1 comparisons

    max(N)
    /
    max(N/2) max(N/2)

  2. remove the MAX and find the MAX again log2n – 1 comparison

PS. It uses additional memory, but it faster than random selection algorithm in worst case.

answered Apr 5, 2012 at 11:47

vasste's user avatar

Can’t we just sort this in decreasing order and take the 2nd element from the sorted array?

answered Oct 5, 2012 at 0:16

jhon's user avatar

jhonjhon

872 silver badges10 bronze badges

How about the following below.
make_heap is O(n) so this is efficient and this is 1-pass
We find the second max by taking advantage that it must be one of the heap children of the parent, which had the maximum.

#include <algorithm>
#include <iostream>

int main()
{
    int arr[6]={0,1,2,3,4,5};

    std::make_heap(arr, arr+6);
    std::cout << "First Max: " << arr[0] << 'n';
    std::cout << "Second Max: " << std::max(arr[1], arr[2]) << 'n';
    return 0;
}

answered Jan 7, 2013 at 17:39

SJHowe's user avatar

SJHoweSJHowe

7565 silver badges11 bronze badges

int max,secondMax;
max=secondMax=array[0];
                                                for(int i=0;i<array.length;i++)
    {                                                   if(array[i]>max)                                                    {                                           max=array[i];                                                   }
                                                        if(array[i]>secondMax && array[i]<max)                                                  {
    secondMax=array[i];                                                 }
    }

answered Apr 22, 2013 at 9:48

Fakhar uz zaman's user avatar

#include <iostream>
using namespace std;

int main() {

   int  max = 0;
    int sec_Max = 0;

    int array[] = {81,70,6,78,54,77,7,78};

    int loopcount = sizeof(array)/sizeof(int);

    for(int i = 0 ; i < loopcount ; ++i)
    {

        if(array[i]>max)
        {
            sec_Max = max;
            max = array[i];
        }

        if(array[i] > sec_Max && array[i] < max)
        {
            sec_Max = array[i];
        }
    }

    cout<<"Max:" << max << " Second Max: "<<sec_Max<<endl;

    return 0;
}

coyotte508's user avatar

coyotte508

9,0156 gold badges43 silver badges63 bronze badges

answered Jun 5, 2016 at 11:18

Bunny's user avatar

BunnyBunny

11 bronze badge

1

// Set the first two different numbers as the maximum and second maximum numbers

 int max = array[0];
 int i = 1;
//n is the amount of numbers

 while (array[i] == max && i < n) i++;
 int sec_max = array[i];
 if( max < sec_max ) {
    tmp = sec_max;
    sec_max = max;
    max = tmp;
 }

//find the second maximum number

 for( ; i < n; ++i ) {
   if( array[i] > max ) {
     sec_max = max;
     max = array[i];
   } else if( array[i] > sec_max && array[i] != max ) {
     sec_max = array[i];
   }
 }
 printf("The second maximum number is %dn", sec_max);

Flexo's user avatar

Flexo

86.9k22 gold badges190 silver badges272 bronze badges

answered Sep 24, 2011 at 12:13

tianya's user avatar

tianyatianya

931 silver badge4 bronze badges

1

Когда в списке много элементов, нам может понадобиться найти максимальный или минимальный элемент, и Python значительно упростил нам задачу.

В этой статье мы расскажем, как можно найти второе по величине число в списке Python с помощью следующих принципов:

  1. Сортировка списка и печать предпоследнего числа списка.
  2. Удаление максимального элемента.
  3. Нахождение максимального элемента.
  4. Перемещение по списку.

Давайте разберем первый подход.

Сортировка списка и печать предпоследнего числа

Следующая программа показывает, как это можно сделать на Python.

Пример –

 
#program to find the second largest number of list 
# declaring the list 
list_val = [20, 30, 40, 25, 10] 
# sorting the list 
list_val.sort() 
#displaying the second last element of the list 
print("The second largest element of the list is:", list_val[-2]) 

Выход:

The second largest element of the list is: 30 

Объяснение –

  1. Мы объявили список, из которого хотим изъять второй элемент, начиная с конца списка.
  2. После этого мы использовали метод сортировки, чтобы все элементы нашего списка располагались в порядке возрастания.
  3. Теперь мы используем отрицательную индексацию, так как второе по величине число будет на предпоследней позиции.

Второй метод – получить второй по величине элемент списка, удалив максимальный элемент.

Давайте посмотрим, как мы можем это сделать.

Удаление максимального элемента

Пример –

 
#program to find the second largest number of list 
 
# declaring the list 
list_val = [20, 30, 40, 25, 10] 
 
# new_list is a set of list1 
res_list = set(list_val) 
 
#removing the maximum element 
res_list.remove(max(res_list)) 
 
#printing the second largest element  
print(max(res_list)) 

Выход:

30 

Объяснение –

Давайте разберемся, что мы сделали в вышеуказанной программе:

  1. Мы объявили список, из которого хотим изъять второй по величине элемент.
  2. После этого мы использовали метод set, чтобы взять все уникальные элементы списка.
  3. Теперь мы используем max(), чтобы получить максимальное значение из списка, а затем удаляем его.
  4. После этого мы печатаем максимум результирующего списка, который даст нам второе по величине число.

В третьем методе мы будем использовать цикл for и и с его помощью найдем второй максимум из списка.

Нахождение максимального элемента

Пример –

 
# declaring empty list 
list_val = [] 
 
# user provides the number of elements to be added in the list 
num_list = int(input("Enter number of elements in list: ")) 
 
 
for i in range(1, num_list + 1): 
 element = int(input("Enter the elements: ")) 
 list_val.append(element) 
 
 
# sort the list 
list_val.sort() 
 
# print second largest element 
print("Second largest element is:", list_val[-2]) 

Выход:

Enter number of elements in list: 5 
 
Enter the elements: 10 
 
Enter the elements: 20 
 
Enter the elements: 30 
 
Enter the elements: 40 
 
Enter the elements: 50 
The second largest element is: 40 

Объяснение –

  1. Мы объявили пустой список, в который будем вставлять элементы.
  2. После этого мы просим пользователя предоставить нам количество элементов, которые мы хотели бы добавить в наш список.
  3. Используем метод сортировки, чтобы все элементы нашего списка располагались в порядке возрастания.
  4. Теперь мы применим отрицательную индексацию, так как второе по величине число будет на второй последней позиции.

Перемещение по списку

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

Следующая программа это проиллюстрирует:

 
def calc_largest(arr): 
 second_largest = arr[0] 
 largest_val = arr[0] 
 for i in range(len(arr)): 
 if arr[i] > largest_val: 
 largest_val = arr[i] 
 
 for i in range(len(arr)): 
 if arr[i] > second_largest and arr[i] != largest_val: 
 second_largest = arr[i] 
 
 return second_largest 
print(calc_largest([20, 30, 40, 25, 10])) 

Выход:

30 

Объяснение –

Давайте разберемся, что мы сделали в вышеуказанной программе:

  1. Первый шаг – создать функцию, которая проверяет наибольшее число из списка, просматривая его.
  2. В следующем цикле for мы снова просматриваем список для поиска наибольшего числа, но на этот раз исключаем предыдущий, так как здесь наша цель – найти вторую по величине функцию.
  3. Наконец, мы передаем наш список в функцию.

Итак, в этой статье у нас была возможность подумать нестандартно и открыть для себя несколько новых способов разработки логики поиска второго по величине числа в Python.

Изучаю Python вместе с вами, читаю, собираю и записываю информацию опытных программистов.

Добавить комментарий