创建一个 returns 递增序列的函数

Creating a function that returns an increasing sequence

我正在尝试创建一个函数,对于作为数组的整数序列,它可以确定是否有可能通过从数组中删除不超过一个元素来获得严格递增的序列。如果可以删除元素,则输出为 True,否则 return 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。

我真的不明白你的第一个想法是什么...... 更简单的解决方案怎么样?

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

下面的代码使用 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_increasingnon_decreasing