#python #list
#python #Список
Вопрос:
Учитывая список чисел, содержащий либо 0, либо 1, либо -1, как я могу найти самую длинную часть списка, которая начинается с 1 и заканчивается -1.
Например, [0,0,1,1,1,-1,-1,-1,0] : Самая длинная часть равна 6 из-за части списка [1,1,1,-1,-1,-1].
Например, [1,-1,0,1,-1,-1,-1] : Самая длинная часть равна 4 из-за части списка [1,-1,-1,-1]. Обратите внимание, что если бы в исходном списке были только первые 3 элемента (например, [1,-1,0] ), то правильным ответом было бы 2 [1,-1] .
Кроме того, список нельзя разбить на 0, и он может меняться от 1 до -1 только один раз. Другими словами [ 1,-1, 1,-1] по-прежнему только 2.
Спасибо
Ответ №1:
Вам нужно иметь два bool(previous_has_one существует, previous_has_neg_one), чтобы записать, существуют они или нет.
def getLongestPortion(l):
maxx = 0
curMax = 0
JustHadOne = False
JustHadNeg = False
for i in range(len(l)):
if(l[i]==1):
if(JustHadNeg):
curMax = 0
curMax = 1
JustHadOne = True
JustHadNeg = False
elif(l[i]==-1 and JustHadOne):
curMax = 1
maxx = max(maxx,curMax)
JustHadNeg = True
else:
JustHadOne = False
JustHadNeg = False
curMax=0
return maxx
l = [1,-1,-1,0,1,1,-1,-1]
print(getLongestPortion(l))
Ответ №2:
Вот решение для регулярных выражений. Сначала я меняю список like [1, -1, 0, 1, -1, -1, -1]
на строку like 'ab abbb'
, затем я ищу 'a b '
, затем беру максимальную длину совпадений:
import re
max(map(len, re.findall('a b ', ''.join(' ab'[i] for i in l))))