我正在进行编码练习:
给定一个整数序列作为数组,通过从数组中删除不超过一个元素来确定是否可以获得严格增加的序列。
实施例
对于sequence = [1,3,2,1],输出应为 假;
为了获得严格增加的序列,此数组中没有一个元素可以删除。
对于sequence = [1,3,2],输出应为 真;
您可以从数组中删除3以获得严格增加的序列[1,2]。或者,您可以删除2以获得严格增加的序列[1,3]。
所以我写了这段代码:
def almostIncreasingSequence(sequence):
first_list, second_list = [x for x in sequence], [x for x in sequence]
for i in range(len(sequence)-1):
if sequence[i] >= sequence[i+1]:
first_list.remove(sequence[i])
second_list.remove(sequence[i+1])
break
if first_list == sorted(set(first_list)) or second_list == sorted(set(second_list)):
return True
else:
return False
代码通过13/15测试。
以下是我的代码失败的2个输入:
[1, 2, 3, 4, 3, 6]
[3, 5, 67, 98, 3]
两个输入都应返回True但我的代码返回False。有什么想法吗?
答案 0 :(得分:0)
获取您的第一个列表[1, 2, 3, 4, 3, 6]
。在first_list
和second_list
上运行for循环后,这些变量的值为:
In [9]: first_list
Out[9]: [1, 2, 3, 3, 6]
In [10]: second_list
Out[10]: [1, 2, 4, 3, 6]
if
的第一部分是False
因为:
In [12]: sorted(set(first_list))
Out[12]: [1, 2, 3, 6]
通过将列表放入集合中,您已经丢失了3个中的一个。
if
的第二部分是False
,因为second_list
未排序。
因此,if
语句的两个部分都是False
,您的函数返回False
。
答案 1 :(得分:0)
了解list.remove:
从列表中删除值为x的第一项。如果没有这样的项目,则会出错。
>>> l = [1, 2, 3, 4, 3, 6]
>>> l.remove(3)
>>> print(l)
[1, 2, 4, 3, 6]
而不是remove(value)
,请使用pop(index)
:
first_list.pop(i)
second_list.pop(i+1)