H. Числовое фрагментирование

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

Напишите функцию fragments(numbers), которая принимает список целых чисел и возвращает список вложенных списков — каждый из которых представляет собой возрастающий отрезок исходной последовательности.

Примечание

В решении не должно быть вызовов требуемых функций.

Пример

Ввод

result = fragments([0, 4, 5, -9, -6, 3, 2, 3, 4, 9])

Вывод

result = [[0, 4, 5], [-9, -6, 3], [2, 3, 4, 9]]

Ввод

result = fragments([-4, -2, 5, 0, 3, 7, -8, -2, 6, 7, 6, 8, 10, 5, 7, 8])

Вывод

result = [[-4, -2, 5], [0, 3, 7], [-8, -2, 6, 7], [6, 8, 10], [5, 7, 8]]

Решение

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

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

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

Решение

Посмотреть код
Python
def fragments(numbers):
    if not numbers:
        return []
    
    result = []
    current_fragment = []
    
    for number in numbers:
        if not current_fragment:
            current_fragment.append(number)
        elif number > current_fragment[-1]:
            current_fragment.append(number)
        else:
            result.append(current_fragment)
            current_fragment = [number]
    
    if current_fragment:
        result.append(current_fragment)
    
    return result

Решение

Python
def fragments(numbers):
    if not numbers:
        return []
    
    result = [[]]
    
    for number in numbers:
        if not result[-1] or number > result[-1][-1]:
            result[-1].append(number)
        else:
            result.append([number])
    
    return result
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии