为什么我的代码在这个简单的练习中失败了?

时间:2017-06-06 19:29:42

标签: python arrays

我正在进行编码练习:

给定一个整数序列作为数组,通过从数组中删除不超过一个元素来确定是否可以获得严格增加的序列。

实施例

  • 对于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。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

获取您的第一个列表[1, 2, 3, 4, 3, 6]。在first_listsecond_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)