題目
難度:★☆☆☆☆
類(lèi)型:數(shù)學(xué)
編寫(xiě)一個(gè)算法來(lái)判斷一個(gè)數(shù)是不是“快樂(lè)數(shù)”。
一個(gè)“快樂(lè)數(shù)”定義為:對(duì)于一個(gè)正整數(shù),每一次將該數(shù)替換為它每個(gè)位置上的數(shù)字的平方和,然后重復(fù)這個(gè)過(guò)程直到這個(gè)數(shù)變?yōu)?1,也可能是無(wú)限循環(huán)但始終變不到 1。如果可以變?yōu)?1,那么這個(gè)數(shù)就是快樂(lè)數(shù)。
示例
輸入: 19
輸出: true
解釋:
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1
解答
這道題很簡(jiǎn)單,根據(jù)定義進(jìn)行編碼即可,我們構(gòu)建了求取各位平方和的子函數(shù)get_bit_square(n),會(huì)返回輸入數(shù)字每一位的平方和,循環(huán)迭代地計(jì)算每一次輸出的各位平方和,如果出現(xiàn)1,則輸入數(shù)字是快樂(lè)數(shù),此外,我們用一個(gè)臨時(shí)列表sq記錄已經(jīng)出現(xiàn)過(guò)的各位平方和,查看每次計(jì)算出各位平方和是否在列表中出現(xiàn)過(guò),若出現(xiàn)過(guò),則之后的計(jì)算會(huì)循環(huán)下去,無(wú)法得到各位平方和為1的結(jié)果,不是快樂(lè)數(shù)。
class Solution(object):
def isHappy(self, n):
"""
:type n: int
:rtype: bool
"""
def get_bit_square(n):
"""
計(jì)算各位平方和
:param n:
:return:
"""
s = 0
while n:
r, n = n % 10, n // 10
s += pow(r, 2)
return s
sq = [] # 用于暫存每一步的各位平方和
while True: # 死循環(huán)
if n == 1: # 如果遇到各位平方和為1,則是快樂(lè)數(shù)
return True
n = get_bit_square(n) # 計(jì)算下一個(gè)各位平方和
if n in sq: # 如果計(jì)算結(jié)果在之前的記錄中存在過(guò)
return False # 說(shuō)明一定會(huì)繼續(xù)循環(huán)下去,不是快樂(lè)數(shù)
sq.append(n) # 否則添加到臨時(shí)列表中
如有疑問(wèn)或建議,歡迎評(píng)論區(qū)留言~