1.问题描述

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 nth round, you only toggle the last bulb. Find how many bulbs are on after n rounds.

Example:

Given n = 3.

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 盏电灯,最开始时都是关着的。现在要进行 n 轮操作:
第1轮操作是把每一盏灯的开关按一下(全部打开)。
第2轮操作是把每两盏灯的开关按一下,即第2,4,6,8…盏灯的开关按一下。
第3轮操作是把每三盏灯的开关按一下,即第3,6,9…盏灯的开关按一下。
如此往复,直到第 n 轮,即只按一下第 n 盏灯的开关。
现在给你输入一个正整数 n 代表电灯的个数,问你经过 n 轮操作后,这些电灯有多少盏是亮的?

2.暴力解法

    private static int buldSwitchForce(int n) {boolean[] flags = new boolean[n];for(int i=1; i<=n; i++) {for(int j=1; j<=n; j++) {if (i%j == 0) {flags[i-1] = flags[i-1] == true ? false: true;}}}int count = 0;for(boolean each: flags) {if (each) count += 1;}return count;}

暴力解法就是两层循环:
第一层循环表示第几盏灯,等的状态用布尔数组描述,如果false表示关,如果true表示打开。
第二层循环表示第k轮循环,如果i%j==0,表示这盏灯的状态要发生改变。如果这盏灯之前的状态是开的(true),那么要变成关(false)的状态,反之亦然。
最后计算数组中状态为true的个数,就是灯还亮的个数。
这种算法的时间复杂度O(n2)O(n^2)O(n2)。

3.更好的解法

上面的暴力解法,肯定不是我们希望的最优解,下面来分析一下更好的解法。
对于这种一开始没有太多头绪的情况,我们可以采用常见的递推,或者说找规律的方法来试试
假设n=3,最终结果为1,只有第一盏灯最后亮。
第一轮的时候,所有灯都被打开。
第二轮的时候,第二盏灯被灭了。
第三轮的时候,第三盏灯被灭了。
2=2∗1,3=3∗12=2*1, 3=3*12=2∗1,3=3∗1
假设n=4,最终结果为2,有两盏灯最后亮。
第一轮的时候,所有灯都被打开。
第二轮的时候,第二盏灯,四盏灯被灭了。
第三轮的时候,第三盏灯被灭了。
第四轮的时候,第四盏灯被灭了。
2=2∗1,3=∗1,4=4∗1=2∗22=2*1, 3=*1, 4=4*1=2*22=2∗1,3=∗1,4=4∗1=2∗2
如果我们从n一直取到8,最终结果都是2。到9的时候,最终结果就变成了3。因为9=1∗9=3∗39=1*9=3*39=1∗9=3∗3。

一个灯从初始时的灭,到最后第n轮结束,要经历多次状态的切换,如果经历了奇数次,则最后是亮的,否则是灭的。根据上面的推导不难看出,一个数为完全平方数,其不重复因数个数才为奇数个。因为如果不为完全平方数,肯定可以表示为成对因数的乘积。

所以最后的结果可以表示为:

    private static int bulbSwitch(int n)  {return (int)Math.sqrt(n);}

为什么求平方根就可以?
假设我们现在有9盏灯,最后结果为3,亮着的三盏灯就是1=1∗1,4=2∗2,9=3∗31=1*1, 4=2*2, 9=3*31=1∗1,4=2∗2,9=3∗3这三盏,所以直接取平方根即可。

leetcode319 Bulb Switcher相关推荐

  1. [leetcode] Bulb Switcher

    题目: There are n bulbs that are initially off. You first turn on all the bulbs. Then, you turn off ev ...

  2. LeetCode(319):灯泡开关 Bulb Switcher(Java)

    2019.8.6 #程序员笔试必备# LeetCode 从零单刷个人笔记整理(持续更新) 每个数i必能分解成任意两个数的乘积(最少会有1*i),因此只有平方数会进行单次开关,因此只需要统计截止n的平方 ...

  3. LeetCode Bulb Switcher(约数个数为奇数)

    题意:给出n个灯泡,第一次,将所有灯泡打开,第二次,每隔1个按灯泡开关,第三次,每隔2个按灯泡开关,最后,隔n-1个按小灯泡开关,问最后 有几个灯泡是开着的 思路:经过奇数次变换后灯泡是开着的,所以就 ...

  4. 灯的开关 Bulb Switcher II

    为什么80%的码农都做不了架构师?>>>    问题: There is a room with n lights which are turned on initially and ...

  5. leetcode 319. Bulb Switcher | 319. 灯泡开关

    题目 https://leetcode.com/problems/bulb-switcher/ 题解 本题将 对问题抽象的能力 的考察做到了极致. 思路 怎么理解(int)Math.sqrt(n)就是 ...

  6. LeetCode 319. Bulb Switcher--C++,java,python 1行解法--数学题

    LeetCode 319. Bulb Switcher–C++,java,python 1行解法 LeetCode题解专栏:LeetCode题解 LeetCode 所有题目总结:LeetCode 所有 ...

  7. 继续过中等难度.0309

      .   8  String to Integer (atoi)    13.9% Medium   . 151 Reverse Words in a String      15.7% Mediu ...

  8. LeetCode 所有题目总结

    文章目录 做题注意事项 题目分类 1.位运算 2.字符串题型 3.TopK 问题--最大堆/最小堆 4.链表 5.动态规划 easy Medium hard 6.贪心 7.树 8.图 9.数学题 10 ...

  9. 【LeetCode】智商题 brainteaser(共3题)

    [292]Nim Game [319]Bulb Switcher [777]Swap Adjacent in LR String (2019年2月13日,谷歌tag) 给了两个字符串start 和en ...

  10. LeetCode github集合,附CMU大神整理笔记

    Github LeetCode集合 本人所有做过的题目都写在一个java项目中,同步到github中了,算是见证自己的进步.github目前同步的题目是2020-09-17日之后写的题.之前写过的题会 ...

最新文章

  1. 【TCP/IP详解 卷一:协议】第十九章 TCP的交互数据流
  2. Kali Linux Web***测试之 WebSploit
  3. iis php根目录可以访问子目录不行,wordpress在IIS下伪静态后子目录无法访问的解决方法...
  4. java学习-http中get请求的非ascii参数如何编码解码探讨
  5. 关于星空的java小程序_[Java教程]小程序使用Canvas画饼图_星空网
  6. Java如何解决乱码问题
  7. 有益的CountDownLatch和棘手的Java死锁
  8. IP设置应用v1.0
  9. Linux指令:AWK - 可编程流编辑器
  10. 如何成为一名优秀的web前端工程师
  11. NIPS中稿,聊聊科研!
  12. SQL笔记三:MySQL常用函数
  13. 拓端tecdat|R语言对二分连续变量进行逻辑回归数据分析
  14. ThinkPHP框架的增删改
  15. Nuxt3 服务端渲染 、elementplus多皮肤黑暗模式
  16. HTML5期末大作业:我的家乡网站设计——我的家乡-杭州(7页) HTML+CSS+JavaScript 大学生家乡网页作品 老家网页设计作业模板 学生网页制作源代码下载
  17. 物理路径,相对路径,绝对路径以及根目录
  18. MYSQL学习日记(三)
  19. 如何将自己的电脑变成WiFi热点
  20. 浅谈精益数字化工厂(Lean Digital Factory, LDF)

热门文章

  1. MySQL双主机双Master方案测试
  2. 2017-07-08 前端日报
  3. 学习面向对象的第一天,感觉还好啦
  4. Asp.Net前台页面调用后台cs变量
  5. Elastic search相关
  6. 给予redis和zookeeper的分布式锁
  7. zookeeper核心原理(Watcher、事件和状态)
  8. 关于Initializing Spring root WebApplicationContext解决方法
  9. flutter 路由
  10. Web安全实践(12)密码探测