我在一个在线评判网站上玩,其中一个问题给了我一个超时错误,这意味着我的代码运行得太慢了。我知道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。
答案 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]