@uta17

Как написать прогрмму которая будет находить самую длинную последовательность чисел c разницой в 1?

while 1:
    try:
        a = int(input('число '))
        break
    except ValueError:
        print('число')
l = []
f = int(0)
for x in range(len(a)):
    try:
        if int(a[x]) - int(a[x+1]) == 1: 
            f += 1
            l.append(str(a[x]))
    except:
        pass
print(f,l)
  • Вопрос задан
  • 308 просмотров
Решения вопроса 1
adugin
@adugin Куратор тега Python
Вариант #1 (для возрастающих субпоследовательностей):
from itertools import count

def subsequences(sequence):
    start = 0
    expected = count(sequence[start])
    last_index = len(sequence) - 1
    for end, val in enumerate(sequence):
        flag_val = val == next(expected)
        flag_end = end == last_index
        if flag_val:
            if flag_end:
                yield sequence[start:]
            continue
        yield sequence[start:end]        
        if flag_end:
            yield sequence[end:]
            continue
        expected = count(sequence[end+1])
        start = end
        
def solve(sequence):
    return max(subsequences(sequence), key=len) 

if __name__ == '__main__':
    sequence = [0, 2, 3, 6, 7, 8, 9, 10, 13, 14, 15, 16, 20]
    print(solve(sequence))  # => [6, 7, 8, 9, 10]

Вариант #2 (универсальный, т.к. считает модуль разности):
from operator import sub
from itertools import groupby

def solve(sequence, step=1):
    pairs = zip(sequence[:-1], sequence[1:])
    criteria = lambda pair: abs(sub(*pair)) == step
    grouped = groupby(pairs, key=criteria)
    subsequences = (tuple(group) for flag, group in grouped if flag)
    result, extra = zip(*max(subsequences, key=len))
    return result + extra[-1:]

if __name__ == '__main__':
    sequence = [0, 2, 3, 6, 7, 6, 7, 8, 9, 10, 13, 14, 15, 16, 20]
    print(solve(sequence))  # => (6, 7, 6, 7, 8, 9, 10)

Первый способ в 1.5 раза быстрее второго.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@fireSparrow
Во-первых, оформляйте вопрос так, чтобы было понятно, в чём именно он заключается.
Если ваш код выдаёт конкретную ошибку, то и спрашивать нужно про эту ошибку, и приводить её полный текст.

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

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

Ну и ещё - не нужно внутри цикла отлавливать ошибку выхода за пределы списка, достаточно просто цикл делать не до последнего, а до предпоследнего элемента:
for x in range(len(a)-1):
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы