如何在迭代更快的时候进行?

时间:2014-12-31 12:46:38

标签: python performance list

我在一个在线评判网站上玩,其中一个问题给了我一个超时错误,这意味着我的代码运行得太慢了。我知道Python一般来说语言很慢,但是有没有办法提高下面代码的速度?

a = input()
cards = []
for num in xrange(1,a+1):
    cards.append(num)
counter = True

while len(cards) > 1:
    if counter:
        del cards[0]
        counter = False
    else:
        cards.append(cards[0])
        del cards[0]
        counter = True

print cards[0]

EDITTED

很抱歉这是一个模糊的问题。 因此问题要求程序打印出执行后剩余的最后一张卡。首先,将删除第一张卡,然后将第一张卡发送到堆栈的最后面。将重复此过程,直到一个卡留在堆栈中。输入是卡的数量。

如果输入为6,则输入isntance,输出为4。

4 个答案:

答案 0 :(得分:3)

以下行等于cards=range(1,a+1)

cards = []
for num in xrange(1,a+1):
    cards.append(num)

如前面的行使用额外的赋值和append()函数,所以用以下代码替换所有这些行:

cards=range(1,a+1)

答案 1 :(得分:3)

除了@Kasra建议你的代码中另一个较慢的部分是删除第0个索引的项目,lists it's O(N) operation。更好的数据结构是collections.deque,允许在任一端快速插入和删除。

答案 2 :(得分:1)

我认为这应该对你有用

a = input()
cards = range(a, 0, -1)
while len(cards)>1:
    del cards[1::2]
print cards[0]

答案 3 :(得分:1)

你拥有的是The Josephus Problem的一个实例,可以按如下方式解决:

def winner(n):
    if n==1:
        return 1
    elif not n%2:
        return 2*winner(n/2) - 1
    else:
        return 2*winner(n//2) + 1

现在,您可以使用此解决方案解决您的特定问题,如下所示:

cards = range(1, a+1)
answer = cards[winner(a)-1]