切換
舊版
前往
大廳
主題

LeetCode - 202. Happy Number 解題心得

Not In My Back Yard | 2020-09-07 00:00:04 | 巴幣 2 | 人氣 299

題目連結:


題目意譯:
撰寫一個演算法去判斷一數字 n 是否「快樂」。

一個快樂數定義為如下流程:
從某個正整數開始,將其值替換成其每位數平方後的總和。重複此步驟直到該數等於 1 或是陷入無窮的、不含 1 的循環。
而那些將由上述過程會到達 1 的數字,即為快樂數。

如果 n 是快樂數,回傳真(True);反之,回傳假(False)。



範例測資:
輸入: 19
輸出: true
解釋:
1 ^ 2 + 9 ^ 2 = 82
8 ^ 2 + 2 ^ 2 = 68
6 ^ 2 + 8 ^ 2 = 100
1 ^ 2 + 0 ^ 2 + 0 ^ 2 = 1


解題思維:
正常的作法是利用雜湊表判斷當前的數字有沒有出現過,有出現過就是陷入了迴圈;沒出現就繼續進行下列的步驟:
把數字 n 拆解成一個個的位數,然後將每個位數平方再全部加起來。將該總和替換掉原本的 n 值,然後重複判斷有沒有出現,或是直到出現 1 為止。



但是根據數論,十進位的快樂數只有一個無窮循環如下:
4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4 → ...
其他數字不是到達 1 ,就是進入此循環之中。因此,我們可以重複迭代直到碰到 1 或是 4 。如果結束在 1 ,那麼原本的數字 n 是一個快樂數;反之,結束在 4 的話,則代表該數為一個不快樂數。

原因可以從完美數字恆定數(Perfect Digital Invariant)的英文維基頁面略知一二,也可以看到一些對於快樂數定義的進位制推廣或是次方推廣。

簡單來說,快樂數定為一個 b 進位制的數字經由將每個位數取 p 次方後相加,重複此步驟。如果遇到 1 ,就是快樂數;如果遇到循環或是非平凡(Non-trivial,在這邊就是 1 以外的)完美數字恆定數,是不快樂數。

而對於 p = 2 的快樂數,其不存在 3 位數(含)以上的完美數字恆定數。因此對於本題的十進位,我們可以暴力搜尋 1 ~ 99 之間的數字,而我們只會找到平凡完美數字恆定數(也就是 1),以及唯一一個循環(4 開頭那個)。因此,其他的數字只會到達該循環或是 1 。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

相關創作

更多創作