我正在尝试创建一个函数,以整数序列作为数组可以确定是否可以通过从数组中删除不超过一个元素来获得严格递增的序列。如果可以删除某个元素,则输出为True,否则返回False。我尝试过,
def almostIncreasingSequence(sequence):
if sequence[:-1] == sequence[1::]:
return True
else:
return False
它适用于列表,
sequence = [1, 3, 2, 1]
>>> False
由于您无法删除任何会导致序列增加的数字。但是,如果列表为
sequence: [1, 3, 2]
>>> True
这是正确的,因为您可以删除2或3以增加序列。我的函数虽然错误地输出False。
答案 0 :(得分:3)
我真的不明白你的第一个主意是什么... 一个更简单的解决方案怎么样?
def fn(seq):
last_i = None
lives = 1
for i in seq :
if last_i is None :
last_i = i
else :
if (i <= last_i):
lives = lives - 1
if (lives < 0) :
return False
last_i = i
return True
>>> fn([1, 3, 2, 1])
False
>>> fn([1, 3, 2])
True
>>> fn([1, 3, 2, 3])
True
>>> fn([1, 3, 2, 4, 6, 8])
True
>>> fn([1, 3, 2, 4, 6, 8, 2])
False
答案 1 :(得分:0)
下面的代码使用 this answer中编写的单调性检查,并迭代列表中的元素以检查是否弹出单个元素会导致单调性增加。
def strictly_increasing(L):
return all(x<y for x, y in zip(L, L[1:]))
def non_decreasing(L):
return all(x<=y for x, y in zip(L, L[1:]))
L = [1, 3, 2]
L_mod = L.copy()
my_bool = False
if not strictly_increasing(L):
for i, x in enumerate(L):
L_mod.pop(i)
if strictly_increasing(L_mod):
my_bool = True
exit
else: L_mod = L.copy()
else:
my_bool = True
根据需要使用strictly_increasing
或non_decreasing
。