题目在这:https://leetcode-cn.com/problems/bulb-switcher/
这道题题目描述的就很清楚,由于第一轮和第二轮都是固定的,所以可以直接从第三轮开始,n如果等于0或者1,就直接返回0或者1。
从第三轮开始,N轮时,下标为N-1的灯变换开关。所以直接写两层for就行了。
完整代码
if n == 0:
return 0
if n == 1:
return 1
# 初始 [关闭, 关闭,关闭, 关闭,]
# 第一轮 [开启, 开启,开启,开启]
# 第二轮 [开启, 关闭,开启,关闭]
# 第三轮 [开启, 关闭,关闭, 关闭]
# 第四轮 [开启,关闭,关闭,开启]
# 先设置初始数组
res = [True for i in range(n)]
time = n
for i in range(2, n+1):
j = 1
while i * j -1 < len(res):
if res[i * j - 1]:
res[i * j - 1] = False
n -=1
else:
res[i * j - 1] = True
n +=1
# res[i * j - 1] = False if res[i * j - 1] else True
j += 1
return n
超时了。。。。。
我们直接输出 n从0-999的时候每次等亮的个数。
第 0 轮亮着的灯数为 0
第 1 轮亮着的灯数为 1
第 2 轮亮着的灯数为 1
第 3 轮亮着的灯数为 1
第 4 轮亮着的灯数为 2
第 5 轮亮着的灯数为 2
第 6 轮亮着的灯数为 2
第 7 轮亮着的灯数为 2
第 8 轮亮着的灯数为 2
第 9 轮亮着的灯数为 3
第 10 轮亮着的灯数为 3
第 11 轮亮着的灯数为 3
第 12 轮亮着的灯数为 3
第 13 轮亮着的灯数为 3
第 14 轮亮着的灯数为 3
第 15 轮亮着的灯数为 3
第 16 轮亮着的灯数为 4
第 17 轮亮着的灯数为 4
第 18 轮亮着的灯数为 4
第 19 轮亮着的灯数为 4
第 20 轮亮着的灯数为 4
第 21 轮亮着的灯数为 4
第 22 轮亮着的灯数为 4
第 23 轮亮着的灯数为 4
第 24 轮亮着的灯数为 4
规律还是挺明显的,亮灯个数随着轮数的增加而增加。
从0轮开始:
3轮增加一个亮灯数,后面5轮增加一个,再后面 7轮增加一个亮灯数,再后面 9轮增加一个亮灯数,以此类推。
根据这个规律写程序。
完整代码
if n == 0:
return 0
if n == 1:
return 1
res = 1
i = 3
j = 1
while True:
if n <= i:
return res
j +=2
i += j + 2
res +=1
当然这道题的正经数学方法放到最后,但其实每次做到这种数学推论的题,并不是很简单就能想到,还是用这样旁门左道的方法比较容易解题。
正经推理:
class Solution:
def bulbSwitch(self, n: int) -> int:
return int(sqrt(n))