最近又想搞即時通訊又想搞網絡框架,然而都沒弄出來,不過每周面試題還是得照常繼續的。
2015盞燈,一開始全部熄滅,序號分別是1-2015,先把1的倍數序號的燈的開關全部按一次,然後把2的倍數的燈的開關全部按一次,然後把3的倍數的開關按一次,以此類推,最後把2015的倍數燈的開關按一次。問最後亮著的燈有多少盞?
A. 43
B. 44
C. 45
D. 46
咋一看,這不是數學問題嗎?干脆用數學解了。
先來分析一下,因為一開始的時候 2015 盞燈都是熄滅的,按一次燈就開了, 按兩次燈就熄滅了,由此可以知道只有按過奇數次的燈才可能是亮著的,題目中還有一個信息,就是把 1 的倍數的燈按一次,把 2 倍數的燈按一次,把 3 倍數的燈按一次,如此類推,這不就是求每個數的公約數嗎?因此結合第一第二個條件,我們就可以把題目演化成求1-2015中有哪些數的公約數是奇數個的。如:1 , 4, 9 , 16….. (注:一個數的約數必然包括1及其本身) 這樣算還是比較麻煩,我們可以繼續把題目演化,求哪些數的公約數是奇數個其實也就是求哪些數是平方數,為什麼呢?因為約數都是成對出現的,平方數是由兩個相同的約數得到的,但是算個數是只算一個。偶數加奇數是奇數。所以只有平方數才有奇數個約數。最後,問題就變得很簡單了,其實就是求1-2015中有多少個平方數,換個角度就是:44^2<2015<45^2,最後的答案就是 44 個,選 B
其實這道題也就是leetcode原題 【319. Bulb Switcher】,其實看看我以往發的面試題可以知道,大公司的面試題基本都是算法題,而且都是根據一些經典的算法題更改或原封不動地出的。
最後用 Java 來解一下,其實就是一句話的問題。