為了加強自己的程式能力,因此開始記錄刷leetcode的解法+說明,會用Ruby
、python
和JavaScript
三個語言來解題
題目來源:leetcode
其實這題和之前解過的square every digit蠻像的,都要將個別的數字平方,不過這裡多了判斷加總是否等於1的步驟。
其實到這步就可以寫出程式碼,利用不斷迭代加上判斷式,判斷是否為快樂數。
以Ruby示範可以這樣寫:
1 2 3 4 5 6 7
| def is_happy(n)
while n != 1 n = n.to_s.chars.map { |digit| digit.to_i ** 2 }.sum end n == 1 end
|
但如果想要程式碼效率更高一點呢?
就需要更了解快樂數一點,關於快樂數的介紹,可以參考維基百科:快樂數
其中有提到:
不是快樂數的數稱為不快樂數(英語:unhappy number),所有不快樂數的數位平方和計算,最後都會進入 4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4 的循環中。
因此,如果數字有4
可以先排除,因為會進到無限循環中,這時程式碼可以寫成這樣:
1 2 3 4 5 6 7
| def is_happy(n) while n != 1 && n != 4 n = n.to_s.chars.map { |digit| digit.to_i ** 2 }.sum end n == 1 end
|
也可以把循環的數字,製作成一個set
,避掉所有不快樂數無限循環的可能:
1 2 3 4 5 6 7 8 9 10
| def is_happy(n) cycle_set = Set.new([4, 16, 37, 58, 89, 145, 42, 20])
while n != 1 && !cycle_set.include?(n) n = n.to_s.chars.map { |digit| digit.to_i ** 2 }.sum end
n == 1 end
|
因為覺得第二種解法比較直觀,效率也比較好,因此python
& js
我都使用第二種寫法:
Python
1 2 3 4
| def is_happy(n): while n != 1 and n != 4: n = sum(int(digit) ** 2 for digit in str(n)) return n == 1
|
JavaScript
1 2 3 4 5 6
| function isHappy(n) { while (n !== 1 && n !== 4) { n = String(n).split('').map(Number).reduce((sum, digit) => sum + digit ** 2, 0); } return n === 1; }
|
评论