Вывести самую длинную последовательность (в списке python)
Помогите написать код, который получает набор чисел, вычисляет самый продолжительных тренд из этих чисел и выводит его на экран.
Например, вводим 1 2 7 12 4 5 6 8 7 5 4 2 1 11 13 Должны получить в ответе: 8 7 5 4 2 1
Например, вводим 1 2 7 12 4 5 6 8 7 5 4 2 1 11 13 14 17 21 33 34 Должны получить в ответе: 1 11 13 14 17 21 33 34
Например, вводим 1 2 5 5 5 4 3 2 Должны получить в ответе: 5 5 5 4 3 2
То есть рассматривается как возрастающая так и убывающая последовательность, с повторяющимися символами
Ответы (2 шт):
Взяли стартовый индекс. Начали идти дальше. Если знак разности с предыдущим числом меняется - остановились, посчитали разницу со стартовым индексом, если она больше текущего максимума - запомнили. Взяли предыдущий индекс за старт и продолжаем.
Я не изучаю Python, так что сразу извиняюсь за плохой код или что-то ещё, но если я правильно понял задачу, то это её решение:
def getLargestSequence (list, comparator):
largestSequence = []
for i in range (0, len (list) - 1):
currentSequence = [list[i]]
for y in range (i + 1, len (list)):
if comparator (list[y], currentSequence[len (currentSequence) - 1]):
currentSequence.append (list[y])
else:
break
if len (currentSequence) > len (largestSequence):
largestSequence = currentSequence
return largestSequence
inputList = [int (x) for x in input ().split ()]
list2 = getLargestSequence (inputList, lambda x, y: x >= y)
list3 = getLargestSequence (inputList, lambda x, y: x <= y)
print (list2 if len (list2) >= len (list3) else list3);
В первом цикле метода getLargestSequence мы берём стартовый индекс для последовательности, дальше, во втором цикле, мы перебираем числа, которые стоят после стартового индекса и если они удовлетворяют условие (больше или меньше), то добавляются в новую последовательность. И так каждый цикл. В конце возвращаем наибольшую из этих последовательностей.
Вариант без двойного цикла:
def getLargestSequence (list, comparator):
largestSequence = []
currentSequence = [list[0]]
for i in range (1, len (list)):
if comparator (list[i], currentSequence[len (currentSequence) - 1]):
currentSequence.append (list[i])
else:
if len (currentSequence) > len (largestSequence):
largestSequence = currentSequence
currentSequence = [list[i]]
if len (currentSequence) > len (largestSequence):
largestSequence = currentSequence
return largestSequence
inputList = [int (x) for x in input ().split ()]
list2 = getLargestSequence (inputList, lambda x, y: x >= y)
list3 = getLargestSequence (inputList, lambda x, y: x <= y)
print (list2 if len (list2) >= len (list3) else list3);
Тут в одном цикле перебираются все числа и вместе с этим создаётся последовательность, которая проверяется на длину (и заменяет собой largestSequence, если надо) и обнуляется, если следующее число не подходит.