三個月沒有新增文章了!

原因是暑假去IBM實習的緣故,6月底忙著打理台北的落腳處和一些學期末雜事,拉哩拉雜的總總,導致想記錄東西的意志被消滅了XD

實習期間也是忙得不可開交,加上是用實驗室的筆電很不習慣,整個暑假就沒有在顧部落格了
最近又開始在寫leetcode的題目,之前被medium電太慘,每一題平均思考加 Debug 的時間都要花兩小時
信心大受打擊,決定從easy慢慢刷= =

是說leetcode的easy跟medium難度有點落差,easy有些題目根本太簡單……

當然有些還是滿有思考挑戰的,比如最近遇到的一題有趣的問題

給你一個數字請你算出數根

比如 digital root (2016) = 2 + 0 + 1 + 6 = 9

若是超過9則需要再拆開加一次

比如 digital root (2216) = 2 + 2 + 1 + 6 = 11 = 1 + 1 = 2

身為喜愛研究命理學的份子,這題目讓我瞬間聯想到”生命靈數”哈哈

第一次思考這題的時候直接是用人腦的運作方式,想說將數字都加起來,如果大於9就重複動作,也就是用遞迴的方式去做

正自信滿滿要開始寫code的時候發現hint上面卻說能不能用常數時間算出這題

純數學解法

這下難了,要怎麼用常數時間算 ? 後來就想了好久,認為一定是有某個定理
決定google digital root這東西,果然維基百科出現很多公式XDD

稍微仔細讀一下就會發現一個驚人的事實

原來每個數的數根 = 該數除以9的餘數!!!

如果餘數為0,則數根就為9

當天知道這個定理的時候真心佩服想出來的數學家

真的他媽的太神啦!

2016 mod 9 = 0 , digit root (2016) = 9

2216 mod 9 = 2, digit root (2216) = 2

於是這題完全可以在常數時間直接用數學解掉

不需跑什麼迴圈或是遞迴或是用樹去解= =