Bulb Switcher

LeetCode Q 319 - Bulb Switcher

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 i-th round, you toggle every i bulb. For the n-th round, you only toggle the last bulb. Find how many bulbs are on after n rounds.

Solution

A bulb ends up on iff it is switched an odd number of times.

Call them bulb 1 to bulb n. Bulb i is switched in round d if and only if d divides i. So bulb i ends up on if and only if it has an odd number of divisors.

Divisors come in pairs, like i=12 has divisors 1 and 12, 2 and 6, and 3 and 4. Except when i is a square, like 36 has divisors 1 and 36, 2 and 18, 3 and 12, 4 and 9, and double divisor 6. So bulb i ends up on if and only if i is a square.

So just count the square numbers.

Let R = int(sqrt(n)). That’s the root of the largest square in the range [1,n]. And 1 is the smallest root. So you have the roots from 1 to R, that’s R roots. Which correspond to the R squares.

Note:the return type of Math.sqrt is double, we need to cast it to int.

Code:

public int bulbSwitch(int n) {
	return (int) Math.sqrt(n);
}

   Reprint policy


《Bulb Switcher》 by Tong Shi is licensed under a Creative Commons Attribution 4.0 International License
 Previous
Integer Break Integer Break
LeetCode Q 343 - Integer BreakGiven a positive integer n, break it into the sum of at least two positive integers and ma
2019-04-11 Tong Shi
Next 
Perfect Squares Perfect Squares
LeetCode Q 279 - Perfect SquaresGiven a positive integer n, find the least number of perfect square numbers (for example
2019-04-11 Tong Shi
  TOC