博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode【67】-Bulb Switcher
阅读量:4966 次
发布时间:2019-06-12

本文共 2083 字,大约阅读时间需要 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 ith round, you toggle every i bulb. 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.

比如只有5个灯泡的情况,’X’表示亮,‘√’表示灭,如下所示:

初始状态: X X X X X

第一次: √ √ √ √ √

第二次: √ X √ X √

第三次: √ X X X √

第四次: √ X X √ √

第五次: √ X X √ X

那么最后我们发现五次遍历后,只有1号和4号锁是亮的,而且很巧的是它们都是平方数,是巧合吗,还是其中有什么玄机。我们仔细想想,对于第n个灯泡,只有当次数是n的因子的之后,才能改变灯泡的状态,即n能被当前次数整除,比如当n为36时,它的因数有(1,36), (2,18), (3,12), (4,9), (6,6), 可以看到前四个括号里成对出现的因数各不相同,括号中前面的数改变了灯泡状态,后面的数又变回去了,等于锁的状态没有发生变化,只有最后那个(6,6),在次数6的时候改变了一次状态,没有对应其它的状态能将其变回去了,所以锁就一直是打开状态的。所以所有平方数都有这么一个相等的因数对,即所有平方数的灯泡都将会是打开的状态。

那么问题就简化为了求1到n之间完全平方数的个数,我们可以用force brute来比较从1开始的完全平方数和n的大小,参见代码如下:

思路分析:

  • 只有1号和4号锁是亮的,而且很巧的是它们都是平方数
  • 对于第n个灯泡,只有当次数是n的因子的之后,才能改变灯泡的状态,即n能被当前次数整除,比如当n为36时,它的因数有(1,36), (2,18), (3,12), (4,9), (6,6),
  • 所以所有平方数都有这么一个相等的因数对,即所有平方数的灯泡都将会是打开的状态,非平方数的因子都是对称的,双数次改变意味着没有改变

代码1:

class Solution {public:    int bulbSwitch(int n) {        int res = 1;        while (res * res <= n) ++res;        return res - 1;    }};

代码2:

class Solution {public:    int bulbSwitch(int n) {        return sqrt(n);    }};

我的微信二维码如下,欢迎交流讨论

这里写图片描述

欢迎关注《IT面试题汇总》微信订阅号。每天推送经典面试题和面试心得技巧,都是干货!

微信订阅号二维码如下:

这里写图片描述

参考:

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>

转载于:https://www.cnblogs.com/fengsehng/p/6048697.html

你可能感兴趣的文章
3.13 以类取代类型码
查看>>
linux安装sz && rz功能
查看>>
关于Hive正则技术处理比较规范的日志数据
查看>>
初学C语言
查看>>
T-SQL Recipes之Separating elements
查看>>
checked和unchecked的区别
查看>>
Web性能压力测试之Webbench使用详解
查看>>
php学习笔记6
查看>>
hdu2054 不要想太多,这就一水题
查看>>
CHtmlCtrl的实现
查看>>
洛谷 P1546 最短网络 Agri-Net
查看>>
Spring-cloud & Netflix 源码解析:Eureka 服务注册发现接口 ****
查看>>
技术blog链接
查看>>
web前端实战系列[3]——下拉菜单
查看>>
111 Minimum Depth of Binary Tree 二叉树的最小深度
查看>>
Hadoop使用常见问题以及解决方法1
查看>>
重载与覆盖的差别
查看>>
NLP系列(2)_用朴素贝叶斯进行文本分类(上)
查看>>
&lt;LeetCode OJ&gt; 121. /122. Best Time to Buy and Sell Stock(I / II)
查看>>
HTTP Status 415 – Unsupported Media Type(使用@RequestBody后postman调接口报错)
查看>>