您的位置:首页 > 其它

319-m-Bulb Switcher

2016-04-20 16:54 260 查看
给定n盏灯,第1步把它们都打开on,然后第i步把每i盏灯都置为相反状态,直到第n步完成,问最后有多少盏灯是亮的on?例如给定8盏灯,第1步全亮,第2步置2、4、6、8为off,第3步置3off,6on 。。。第8步置8为相反状态。

看完题目觉得应该跟数字因数的奇偶个数有关系,于是用笔写了下找了规律,发现如果该数字的因数的个数是2的倍数的话那么最后状态一定是off的,所以就照着思路直直的敲了代码提交,最后超时(在求因数个数的时候用的时暴力法,所以是n方时间度)。无奈网搜了下,发现代码异常简单:求n的最大平方根。刚开始还没理解,想了下原来就是我之前思路的更好的抽象版本,例如n = 8时,8的因数是1、2、4、8,所以肯定是off,而质数肯定也是off因为因数是1和它本身,那么什么数的因数个数是奇数呢?没错,平方数。4=1x4=2x2=4x1,16的因数是1、2、4、8、16,归根到底就是因为平方根的解合二为一只会动开关1次,而其他因数都有配对的另一个因数会动开关2次,所以其实题目求的就是从1到n共有多少个平方数,那就是1、4、9、16。。。等等咯。

贴上超时的代码做个记录,跟系统开方函数比对过,结果倒是对的但oj会超时,ac的就不贴了,就一个开方函数。

int bulbSwitch(int n) {
int result = 1;

int count = 0;
for (int i = 2; i <= n; i++) {
for (int j = 2; j <= i / 2; j++) {
if (i % j == 0)
count++;
}
count++;
if (count % 2 == 0)
result++;
count = 0;
}

return result;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode