319. Bulb Switcher&&程序员面试金典6.6
2016-01-11 22:02
555 查看
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:
Subscribe to see which companies asked this question
Hide Tags
Math Brainteaser
太机智
https://leetcode.com/discuss/75014/math-solution
要解决这个问题,我们必须弄清楚所谓的“切换灯泡开关状态”是什么意思。
1.问题:灯泡会在哪几轮切换状态(开或关)?
灯泡n会在n的每个因子(包括1和n本身)对应的那一轮切换状态。也就是说,灯泡15会在第1,3,5,15轮切换状态。
2.问题:灯泡在什么时候还是亮着的?
如果因子的个数是奇数,则这个灯泡是亮着的。
3.问题:因子个数什么时候是奇数?
完全平方数的因子个数是奇数。
4.问题:有多少个完全平方数?
sqrt(n)个。
对于每一个灯泡,当它被开关奇数次时,它最终会是亮的。
将这些灯泡记为灯泡1—灯泡n。灯泡i在第d轮是会被开关当且仅当d可以整除i。所以灯泡i最终是亮着的当且仅当它有奇数个因子。
因子都是成对儿出现的,比如对i=12 有因子1和12,2和6,3和4,除当i是个平方数,例如i=36有因子1和36,2和18,3和12,4和9以及重因子6。所以灯泡i最终是亮着的当且仅当i是平方数。
所以只需要计算平方数的个数。
令R=int(sqrt(n)),它是序列[1,..,n]中最大的平方数的平方根,1是最小的平方根。所以我们就有了从1到R,也就是R个平方根,这就对应着R个平方数。所以R=int(sqrt(n))就是结果。
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.
Subscribe to see which companies asked this question
Hide Tags
Math Brainteaser
太机智
https://leetcode.com/discuss/75014/math-solution
要解决这个问题,我们必须弄清楚所谓的“切换灯泡开关状态”是什么意思。
1.问题:灯泡会在哪几轮切换状态(开或关)?
灯泡n会在n的每个因子(包括1和n本身)对应的那一轮切换状态。也就是说,灯泡15会在第1,3,5,15轮切换状态。
2.问题:灯泡在什么时候还是亮着的?
如果因子的个数是奇数,则这个灯泡是亮着的。
3.问题:因子个数什么时候是奇数?
完全平方数的因子个数是奇数。
4.问题:有多少个完全平方数?
sqrt(n)个。
对于每一个灯泡,当它被开关奇数次时,它最终会是亮的。
将这些灯泡记为灯泡1—灯泡n。灯泡i在第d轮是会被开关当且仅当d可以整除i。所以灯泡i最终是亮着的当且仅当它有奇数个因子。
因子都是成对儿出现的,比如对i=12 有因子1和12,2和6,3和4,除当i是个平方数,例如i=36有因子1和36,2和18,3和12,4和9以及重因子6。所以灯泡i最终是亮着的当且仅当i是平方数。
所以只需要计算平方数的个数。
令R=int(sqrt(n)),它是序列[1,..,n]中最大的平方数的平方根,1是最小的平方根。所以我们就有了从1到R,也就是R个平方根,这就对应着R个平方数。所以R=int(sqrt(n))就是结果。
class Solution { public: int bulbSwitch(int n) { return sqrt(n); } };
相关文章推荐
- 程序员面试金典——递归问题汇总
- 【剑指offer】4.4分解让复杂问题简单化——面试题28:字符串的排列
- 【剑指offer】4.4分解让复杂问题简单化——面试题27:二叉搜索树与双向链表
- 【剑指offer】4.4分解让复杂问题简单化——面试题26:复杂链表的复制
- 黑马程序员——iOS 开发学习---控件制作登录注册页面
- 【剑指offer】4.3举例让抽象问题具体化——面试题25:二叉树中和为某一值的路径
- 【剑指offer】4.3举例让抽象问题具体化——面试题24:二叉搜索树的后序遍历序列
- 【剑指offer】4.3举例让抽象问题具体化——面试题23:从上往下打印二叉树
- 【剑指offer】4.3举例让抽象问题具体化——面试题22:栈的压入、弹出序列
- 【剑指offer】4.3举例让抽象问题具体化——面试题21:包含min函数的栈
- .net面试题
- 面试题6:重建二叉树
- 面试题5:从尾到头打印链表
- 面试题4:替换空格
- 面试题10:二进制中的1的个数
- java面试笔记3
- java面试笔记2
- java 面试笔记1
- iOS面试一般性问题
- [程序猿面试题精选100题]4.二叉树中和为某一值的全部路径