经典数学脑力激荡,从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
答案 0 :(得分:3)
正如其他人所指出的,问题是s+i
索引。循环中s
的最大值为n-1
,因此如果您向其中添加任何内容,则会超出列表的末尾。
你说你想bulbs[1]
step
为bulbs[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));