三個月沒有新增文章了!
原因是暑假去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
於是這題完全可以在常數時間直接用數學解掉
不需跑什麼迴圈或是遞迴或是用樹去解= =