LeetCode 319. Bulb Switcher

栏目: 编程工具 · 发布时间: 6年前

内容简介:There are n bulbs that are initially off. You first turn on all the bulbs. Then, you turn off every second bulb. On the third round, you toggle every third bulb (turning on if it's off or turning off if it's on). For the i-th round, you toggle every i bulb

Description

There are n bulbs that are initially off. You first turn on all the bulbs. Then, you turn off every second bulb. On the third round, you toggle every third bulb (turning on if it's off or turning off if it's on). For the i-th round, you toggle every i bulb. For the n-th round, you only toggle the last bulb. Find how many bulbs are on after n rounds.

Example:

Input: 3
Output: 1 
Explanation: 
At first, the three bulbs are [off, off, off].
After first round, the three bulbs are [on, on, on].
After second round, the three bulbs are [on, off, on].
After third round, the three bulbs are [on, off, off]. 

So you should return 1, because there is only one bulb is on.

描述

初始时有 n 个灯泡关闭。 第 1 轮,你打开所有的灯泡。 第 2 轮,每两个灯泡你关闭一次。 第 3 轮,每三个灯泡切换一次开关(如果关闭则开启,如果开启则关闭)。第 i 轮,每 i 个灯泡切换一次开关。 对于第 n 轮,你只切换最后一个灯泡的开关。 找出 n 轮后有多少个亮着的灯泡。

示例:

输入: 3
输出: 1 
解释: 
初始时, 灯泡状态 [关闭, 关闭, 关闭].
第一轮后, 灯泡状态 [开启, 开启, 开启].
第二轮后, 灯泡状态 [开启, 关闭, 开启].
第三轮后, 灯泡状态 [开启, 关闭, 关闭]. 

你应该返回 1,因为只有一个灯泡还亮着。

思路

  • 数学题,对给定的数字开平方向下取整即是答案。
  • 暴力求解(会超时),但是通过暴力解法可以发现规律。我们声明一个长度为 n 的数组,数组初始值为 0 。然后我们按照题目要求对其进行改变状态的操作,0 表示关,1 表示开。我们通过这个会发现如果给定的 n 为前三个数(1~3)会有 1 盏灯亮着,如果给定的 n 为接下来的 5 个数 (4~8),会有 2 盏灯亮着,接下来的 7 个数(9~15)会有3 盏灯两者,我们称给定的所有可能的 n 中,最后剩下相同的灯亮着的情况的 n 为一组,于是可以发现每组 n 的个数是一个首项为 3 公差为 2 的等差数列。
  • 于是有了第一个解法:我们不断的从 n 中减去,3,5,7 ... (n 小于零就停止),能减少多少次就有多少盏灯亮着。
  • 我们可以发现 1~3:1;4~8:2;9~15:3,16~25:4,不难发现我们对 n 开放取整就可以得到答案,关于严格的数学证明请参考 这里 -solution-with-explanation) 。
# -*- coding: utf-8 -*-
# @Author:             何睿
# @Create Date:        2019-02-23 18:46:36
# @Last Modified by:   何睿
# @Last Modified time: 2019-02-23 19:46:07


class Solution:
    def bulbSwitch(self, n: int) -> int:
        return int(n**0.5)

    def bulbSwitch2(self, n: int) -> int:
        count, i = 0, 3
        # 首项为3,公差为 2 的等差数列
        # n 为这些数字的和
        while n > 0:
            # 每次从 n 中去掉一项
            n -= i
            i += 2
            # 记录去掉的次数
            count += 1
        # 次数就是剩下的晾着的灯泡个数
        return count

    def bulbSwitch3(self, n: int) -> int:
        # 最直观的思路,用一个数组表示灯泡的开关情况,0 表示关,1 表示开
        # !!! 此方法会超时
        bulbs = [0 for i in range(n)]
        for i in range(n):
            j = i
            # 每轮调整 i 整数倍的位置
            while j < n:
                bulbs[j] ^= 1
                j += i + 1
        # 统计最后剩下的 1 的个数
        return bulbs.count(1)

源代码文件在 这里

©本文首发于 何睿的博客 ,欢迎转载,转载需保留 文章来源 ,作者信息和本声明.


以上所述就是小编给大家介绍的《LeetCode 319. Bulb Switcher》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

创业无畏

创业无畏

彼得· 戴曼迪斯、史蒂芬· 科特勒 / 贾拥民 / 浙江人民出版社 / 2015-8 / 69.90元

 您是否有最大胆的商业梦想?您是否想把一个好主意快速转化为一家市值几百亿甚至几千亿元的公司?《创业无畏》不仅分享了成功创业家的真知灼见,更为我们绘制了一幅激情创业的行动路线图!  创业缺人手怎么办?如何解决钱的问题?把握指数型大众工具,互联网就是你车间,你的仓库。拥有好的创意,自然有人把钱“白白地送给你用”。当你大海捞针的时候,激励性大奖赛会让针自己跑到你的眼前来!  掌握指数级......一起来看看 《创业无畏》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

html转js在线工具
html转js在线工具

html转js在线工具