計算機基礎(chǔ)和算法是能否拿到一個好offer的關(guān)鍵因素,月底牛牛就忙完手上項目了,到時也會多分享相關(guān)內(nèi)容,今天就先整一道LeetCode上有趣的算法題熱熱身:燈泡開關(guān)。 01故事起源
初始時有 n 個燈泡,均處于關(guān)閉狀態(tài)。
對某個燈泡切換開關(guān)意味著:如果燈泡狀態(tài)為關(guān)閉,那該燈泡就會被開啟;而燈泡狀態(tài)為開啟,那該燈泡就會被關(guān)閉。
第 1 輪,每個燈泡切換一次開關(guān)。即打開所有的燈泡。
第 2 輪,每兩個燈泡切換一次開關(guān)。即每兩個燈泡關(guān)閉后一個。
第 3 輪,每三個燈泡切換一次開關(guān)。即位于第3、6、9···的燈泡切換開關(guān)。
第 i 輪,每 i 個燈泡切換一次開關(guān)。而第 n 輪,你只切換最后一個燈泡的開關(guān)。
找出 n 輪后有多少個亮著的燈泡。
示例 1:

02問題分析
通過上面的圖例,我們可以很清楚地看到,每一輪都會切換一批燈泡。關(guān)鍵是可能切換到之前已經(jīng)切換過的燈泡,如果我們通過模擬來暴力解決,那么每一輪就要遍歷一次,肯定超時。
那我們換種思路想想,這道題似乎更像一道有數(shù)學規(guī)律的題,這種類型在面試中也不少見。
不過我們不一定能馬上找到規(guī)律,那也不要著急,就按部就班:用0表示off, 1表示on,先列出前10個燈泡的答案,看看其中有什么規(guī)律可循。
n=1:1
n=2:1 0
n=3:1 0 0
n=4:1 0 0 1
n=5:1 0 0 1 0
n=6:1 0 0 1 0 0
n=7:1 0 0 1 0 0 0
n=8:1 0 0 1 0 0 0 0
n=9:1 0 0 1 0 0 0 0 1
n=10: 1 0 0 10 0 0 0 1 0
03發(fā)現(xiàn)規(guī)律
我們仔細看看上面的數(shù)據(jù)就會發(fā)現(xiàn),最后亮燈的位置都在第1、4、9位上,這些位置恰好都是某個因子的平方,比如4,就是2的平方,不知道大家還記得不,在數(shù)學上這種數(shù)字就叫做完全平方數(shù)。
那我們就可以大膽猜測:最后亮燈的位置,都是完全平方數(shù)。那么每多一個完全平方數(shù),就多一個亮的燈泡。
當然,這只是一個猜測,我們可以用暴力法寫一個程序,把前100個的情況打印出來,就能看出,是滿足這個規(guī)律的。
都已經(jīng)驗證到100輪了,那么基本就是這個規(guī)律了。
所以這道題,其實就是尋找n以內(nèi)有多少個完全平方數(shù),具體做法是從數(shù)字1遍歷到數(shù)字n,對每個數(shù)字判斷是否是完全平方數(shù),最差也是O(n)可以解決。
04思考緣由
牛牛是個打破砂鍋問到底的人,雖然通過規(guī)律,解決了問題,但是不搞清楚為什么,總是心里癢癢的。
我們從上面的規(guī)律,可以猜測燈泡亮的數(shù)量一定和平方根的特性有關(guān)系的。
我們先看看一些非完全平方數(shù):
8的因子: 1 2 4 8;
12的因子:1 2 3 4 6 12;
這些因子一定是偶數(shù)個,為什么呢?
因為一個因子,一定是和另一個因子,配合起來,才能得到這個數(shù)字。
回到我們的燈泡,比如我們拿n=3的情況來說,第一輪打開了第三輪的燈泡,第三輪就會給它關(guān)掉,因為1、3是3的成對因子。
但如果是n=4的情況,1、4雖然也會成對抵消,但是第二輪的操作卻無法抵消,因為2的成對因子是2,不會再重復出現(xiàn)。
從這里我們就可以看出來,每增加一個完全平方數(shù),就會多一個不會被抵消掉的因子出現(xiàn),所以個數(shù)也就增加了1。
05更進一步
一般的算法題,O(n)就是性能的極致,但這是一道數(shù)學規(guī)律題,那我們就得多想想還有沒有更快的辦法。
要找到有多少個完全平方數(shù),是否一定要遍歷完1-n?
稍微思考下就可以發(fā)現(xiàn)并不是,拿9舉個:3是9的完全平方因子,在3以上的數(shù)字一定不能構(gòu)成完全平方因子,因為開平方一定超過最大數(shù)字9了。如此一來,我們只用考慮3之前的。
不難發(fā)現(xiàn),3之前的1、2是必然滿足完全平方因子的,因為它們做平方,一定小于3的平方,也就一定在數(shù)據(jù)范圍內(nèi)。
基于上面的分析,我們可以看出,燈泡亮的個數(shù),就是n的平方根向下取整個,代碼就一行:
return (int)Math.sqrt(n)
06燈泡復盤其實在面試中,遇到這種數(shù)學模型的題,是很容易翻車的。如果只是干想,在面試緊張的環(huán)境下,很可能大腦一片空白。 不過,這種題的套路也是有的,基本都可以用先實驗,再猜測,再論證的方式去解決,這個不僅僅是面試套路,也是一種很優(yōu)秀的做事情的模式。
審核編輯 :李倩
-
算法
+關(guān)注
關(guān)注
23文章
4784瀏覽量
98102 -
程序
+關(guān)注
關(guān)注
117文章
3846瀏覽量
85269
原文標題:LC319:燈泡開關(guān)
文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
單片機遙控開關(guān)mos管介紹
芯片熱特性的熱阻描述
【精選直播】openDACS 2025 開源EDA與芯片大賽 賽題五 賽題七 直播宣講會
【精選直播】openDACS 2025 開源EDA與芯片大賽 賽題六 賽題三 直播宣講會
SM4算法實現(xiàn)分享(一)算法原理
【精選直播】openDACS 2025 開源EDA與芯片大賽 賽題二 賽題四 直播宣講會
國密系列算法簡介及SM4算法原理介紹
加密算法的應(yīng)用
【賽題補充說明】2025全國大學生FPGA創(chuàng)新設(shè)計競賽紫光同創(chuàng)杯賽
【賽題教程】基于RK3568+PG2L50H實現(xiàn)八路視頻輸入?yún)⒖挤桨?/a>
PPEC電源DIY套件:圖形化算法編程,解鎖電力電子底層算法實踐
【賽題知多少】 紫光同創(chuàng)賽題答疑專場|2025年全國大學生嵌入式芯片與系統(tǒng)設(shè)計競賽FPGA賽道
DFT算法與FFT算法的優(yōu)劣分析
從細微處把關(guān)!小燈泡氣密性檢測儀對照明行業(yè)的重要性
有趣的算法題熱熱身:燈泡開關(guān)
評論