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