Найти - Пользователи
Полная версия: Задача «Количество элементов, равных максимуму»
Начало » Python для новичков » Задача «Количество элементов, равных максимуму»
1
Sanya9652
Доброго времени суток
В качестве практики решаю задачки на питонтьютор, и попалась следующая:
Последовательность состоит из натуральных чисел и завершается числом 0. Определите, сколько элементов этой последовательности равны ее наибольшему элементу.

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

Ссылка на задачу

 n = int(input())
x = 0 #maximum
y = 1 #schet
while n != 0:
    if x<n:
        x=n
        if y<n:
            y=1 #obnulyaet schet
    elif n == x and not x>n:
        y+=1
    n = int(input())
print(y)
py.user.next
Sanya9652
но что-то мне подсказывает, что сделал все не через то место, и он должен быть существенно короче
Он у тебя даже неправильно реализует алгоритм
  
>>> def f():
...     n = int(input())
...     x = 0 #maximum
...     y = 1 #schet
...     while n != 0:
...         if x<n:
...             x=n
...             if y<n:
...                 y=1 #obnulyaet schet
...         elif n == x and not x>n:
...             y+=1
...         n = int(input())
...     
...     print(y)
... 
>>> f()
1
1
1
2
2
0
4
>>>
Должен выдавать 2.
Rafik
А слабо, собрать входные данные в список, отсортировать его реверсивно и, в цикле, посчитать сколько элементов равны певому элементу списка?
py.user.next
Rafik
А слабо, собрать входные данные в список, отсортировать его реверсивно и, в цикле, посчитать сколько элементов равны певому элементу списка?
Сделай, конечно, так, чтобы чисто лучше питон узнать. Но это алгоритмически неправильно. Во-первых, данные нужно стараться обрабатывать так, будто они поступают бесконечно (это могут быть датчики, огромные массивы данных и тому подобное), поэтому нужно стараться не собирать данные никуда, а обрабатывать их на лету, иначе не хватит памяти и время выполнения будет удлинняться. Во-вторых, ты предложил отсортировать все данные, хотя в них может быть, например, миллиард единиц и двоек и одно число сто. Зачем сортировать этот миллиард элементов? Достаточно число сто получить через линейную функцию max(), а потом считать его количество такой же линейной функцией. При этом миллиард единиц и двоек остаются нетронутыми на своих местах и, соответственно, на них не тратится время на сравнения и перемещения.

У него же алгоритм верный - обработка идёт на лету, - но он его не смог точно реализовать и написал код с ошибкой. Единственное что, он не должен читать из входного потока, а должен брать элементы из итератора, а итератор уже прикрепляется к входному потоку ввода. Так итератор можно прикреплять не только к входному потоку ввода, но и к сетевому сокету, к файлу, к любому генератору данных.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB