Leetcode: happy number

leetcode

為了加強自己的程式能力,因此開始記錄刷leetcode的解法+說明,會用RubypythonJavaScript三個語言來解題

題目來源: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;
}

评论