Python范围函数步长列表分配超出范围错误,模拟脑力激荡

时间:2017-06-06 06:17:03

标签: python range

经典数学脑力激荡,从leetcode获取的问题陈述 "最初有n个灯泡关闭。你首先打开所有的灯泡。然后,你关闭每一个灯泡。在第三轮中,您可以切换每三个灯泡(如果它关闭则打开或者如果它打开则关闭)。对于第i轮,你切换每个灯泡。对于第n轮,您只需切换最后一个灯泡。找出n轮后有多少个灯泡。"

我意识到问题本身有一个简洁的解决方案,但我想模拟灯泡开关问题。但随着步长增加,我遇到列表索引超出范围错误,我该如何处理这个错误?我希望仅在索引仍然有效时切换值。

 def bulbSwitch(self, n):
        """
        :type n: int
        :rtype: int
        """
        bulbs= [0]*n
        step=0
        for i in range(n):
            step += 1
            for s in range(0, n, step):
                bulbs[s+i]=0 if bulbs[s]==1 else 1 #this line produces error
        print bulbs

1 个答案:

答案 0 :(得分:3)

正如其他人所指出的,问题是s+i索引。循环中s的最大值为n-1,因此如果您向其中添加任何内容,则会超出列表的末尾。

你说你想bulbs[1] stepbulbs[2]step for step in range(1, n+1): # this avoids separate `i` vs. `step` variables for s in range(step-1, n, step): # start in the right place bulbs[s] = 0 if bulbs[s] == 1 else 1 为3等等。所以只需在那里开始你的范围:

+1

修改

也许这更容易? (我在这里使用-1代替for step in range(n): # this avoids separate `i` vs. `step` variables for s in range(step, n, step+1): # start in the right place bulbs[s] = 0 if bulbs[s] == 1 else 1 。)

import math

def bulb_switch(n):
    bulbs = [0] * n

    for step in range(n):  # this avoids separate `i` vs. `step` variables
        for s in range(step, n, step+1):  # start in the right place
            bulbs[s] = 0 if bulbs[s] == 1 else 1

    return sum(bulbs)

for i in range(1000):
    assert math.floor(math.sqrt(i)) == bulb_switch(i)

编辑2

确保它有效...我添加了一个测试(通过):

yourmap.addMarker(new MarkerOptions().position(LatLng).title(String).zIndex(float));