Featured image of post 從LeetCode學演算法 - 69 Hash Set (1)

從LeetCode學演算法 - 69 Hash Set (1)

0202. Happy Number (Easy)

Question

Write an algorithm to determine if a number is “happy”.

A happy number is a number defined by the following process: Starting with any positive integer, replace the number by the sum of the squares of its digits, and repeat the process until the number equals 1 (where it will stay), or it loops endlessly in a cycle which does not include 1. Those numbers for which this process ends in 1 are happy numbers.

Example:

1
2
3
4
5
6
7
Input: 19
Output: true
Explanation:
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1

分析/解題

給定一個數,試檢查其是否為快樂數(happy number)
所謂的快樂數就是從一個正整數n開始,將其每一個位數的平方和加總,
作為新的n值,反覆操作,若n最終等於1的話則為快樂數,
否則若n最終會進入一個不包含1的循環的話,則不是快樂數。

之前我們介紹過HashTable(HashMap/Dictionary),
Java的HashSet和Python的set 其實是類似的概念,不過僅限於單值,
也就是說它們每筆資料只存放一個值 ,而非key/value相對。
一個Hash Set裡面,相同的值不能夠重覆出現,
同時利用了hash的性質,其插入/查找 的速度也是O(1)

這題當中我們唯一需要考慮的問題就是當陷入循環的時候怎麼作判定,
所以我們可以使用Hash Set來進行記錄,當中若碰到n等於1的時候,
可以直接回傳true;其他狀況則檢查n是否在Hash Set內
若是,則表示已經碰到循環了,則可脫離迴圈回傳false

在循環內計算下一個n基本上就是將除以10的餘數平方並移位後加總,
這邊就不再贅述。

對Java而言,檢查是否在HashSet內請使用contains()

Java

如果對快樂數有更進一步的認識的話,
當非快樂數陷入循環時會是固定的模式:
4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4

同時,除了1和7以外,低於10的其他數均是非快樂數
所以也可以像上面寫到的另一種解法來處理這個問題,
在執行時間上對測試資料目前看起來是比較快的。

對Python而言,使用in來檢查即可。

Python

面試實際可能會遇到的問題

「時間/空間複雜度?」
(時間複雜度不確定,空間複雜度O(1))

相似及延伸

這題也可以不使用HashSet/set來解,
請思考看看如果用two pointers的方式的話可以怎麼寫XD

Special Thanks suggestions/corrections from viewers:
(歡迎提供意見協助更正歐~)

從LeetCode學演算法,我們下次見囉,掰~

感謝大家對這系列文章的支持!這邊跟大家自我工商一下:

我將於11/26 開設系列同名線上課程**「從Leetcode學演算法|基礎篇」。** 在這堂課中,你將學會利用十種演算法/資料結構來優化解題過程,
並實際完整練習20題 精選考古題,
進而逐漸提升到不需提示也可以突破白板題,取得工作門票!
問卷抽書&取得上架通知: https://pse.is/MS2J2
Leetcode解題挑戰拿優惠: https://pse.is/NAUVP
如果你對線上課程不放心,
也可以先來12/17(二) 我在天瓏分享的講座看看!
講座連結: https://pse.is/JS3LJ

共發表了 171 篇文章 ‧ 總計 311.6k
使用 Hugo 建立
主題 StackJimmy 設計