在 JavaScript 中开关灯泡


问题

考虑以下情况:

最初有 n 个灯泡处于关闭状态。我们首先打开所有灯泡。然后,我们关闭每第二个灯泡。在第三轮中,我们切换每个第三个灯泡(如果关闭则打开,如果打开则关闭)。

一般来说,对于第 i 轮,我们切换每个第 i 个灯泡。最后,对于第 n 轮,我们只切换最后一个灯泡。

我们需要编写一个 JavaScript 函数,它只接受 n 作为输入,并找出 n 轮之后有多少个灯泡是打开的。

例如,如果函数的输入是:

const n = 4;

那么输出应该是:

const output = 2;

输出解释

在状态数组中,0 表示关闭,1 表示打开:

轮次状态
1[1, 1, 1, 1, 1]
2[1, 0, 1, 0, 1]
3[1, 0, 0, 0, 1]
4[1, 0, 0, 1, 1]
5[1, 0, 0, 1, 0]

因此,第五轮之后只有两个灯泡是打开的。

示例

代码如下:

const n = 5;
const findOn = (n = 1) => {
   let off = 0;
   let on = n;
   while(off <= on){
      let mid = Math.floor((off + on) / 2);
      if(mid * mid > n){
         on = mid - 1;
      }else{
         off = mid + 1;
      };
   };
   return Math.floor(on);
};
console.log(findOn(n));

输出

控制台输出:

2

更新于:2021年3月20日

523 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告