前端面试题.......
Posted xzqyun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前端面试题.......相关的知识,希望对你有一定的参考价值。
**************************************************我是华丽的分割线**********************************************************
在博客园看到的这个问题,也想做一下。题目是这样的
房间里有100盏电灯,编号为1,2,3……100,每盏灯上有一个按钮,初始时灯全都是关的。编好号的100位同学由房间外依次走进去,将自己编号的倍数的灯的按钮全部按一次,例如第一位同学把编号是1的倍数的灯的按钮按一下(此时100盏灯全亮),第二位同学把编号是2的倍数的灯的按钮按一下(此时只有50盏灯亮着,50盏被这个人按灭了)……第100位同学把编号是100的倍数的灯(即编号为100的灯)的按钮按一下,请问依次走完后,还有多少盏灯亮着?
最简单的做法就是模拟一下100个同学进入房间的情景,从1号同学开始每个人都去按一遍开关,最后看一下哪些灯亮着,这个方法最简单也最容易想到,可是效率有点低。
let count = { // 所有的灯 getData: function () { let arr = []; for (let i = 1; i <= 100; i++) { arr.push(false); } return arr; }, // 每个人都去操作自己能够操作的灯泡 changeData: function () { let arr = this.getData(); for (let i = 1; i <= 100; i++) { for (let j = 1; j <= 100; j++) { // 如果灯泡 去 取余 若是等于0 则表示可以去操作 if ((j % i) === 0) { let index = j - 1; arr[index] = !arr[index]; } } } return arr; }, // 计算是true 的数据 getTrueData: function () { let trueData = this.changeData().filter(item => item === true); console.log(‘亮灯泡的编号数组 :‘, trueData); console.log(‘亮灯泡的编号数组长度 :‘, trueData.length); } }; count.getTrueData();
网上说其实可以计算一下每个开关被按下的次数,因为刚开始的时候所有的灯泡都是关着的,所以如果某个灯泡的开关被按了奇数次,那么这个灯泡最终就是开着的,否则就是关着的。那怎么计算每个灯泡开关被按下的次数呢?因为每个同学都会按下自己编号倍数的开关,即如果灯泡编号是同学编号的倍数,他就会按下开关,也就是说如果同学编号是灯泡编号的约数,他就会按下开关(这不是废话么)。那么统计一下灯泡编号约数的个数就可以了,约数个数为计数的灯泡最后开着,约数个数为偶数的灯泡最后关着。代码如下,(但是并没看出效率在那)
let lamp = { main: function () { let result = 0; for (let i = 1; i <= 100; i++) { if (this.isOdd(this.getFactorNum(i))) { result += 1; } } console.log(‘return result :‘, result); return result; }, //求n约数的个数 getFactorNum: function (n) { let result = 0; for (let i = 1; i <= n; i++) { if (n % i === 0) { result += 1; } } return result; }, //判断n是否为奇数 isOdd: function (n) { return (n & 1) == 1; } } lamp.main(); // return result : 10
又想了一下还有更简单的算法,因为一个数的约数都成成对出现的,也就是说如果n存在一个约数p,那么一定有一个q与之相对应且满足n=pq,所以n约数的个数一定是偶数,但是有一种情况例外,那就是p=q,所以只有编号为完全平方数的灯泡亮着。按着这个方法计算就简单多了
let array = { getdata: () => { let arr = []; for (let i = 1; i <= 100; i++) { arr.push(i); } return arr; }, trueData: function () { console.log(‘trueData :‘, this.getdata().filter(item => Math.sqrt(item).toString().indexOf(‘.‘) === -1)); return this.getdata().filter(item => Math.sqrt(item).toString().indexOf(‘.‘) === -1); } } array.trueData(); // getFactorNum : (10) [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
若是有问题请大佬赐教.
**************************************************我是华丽的分割线**********************************************************
**************************************************我是华丽的分割线**********************************************************
以上是关于前端面试题.......的主要内容,如果未能解决你的问题,请参考以下文章