202. 快乐数(Happy Number)
编写一个算法来判断一个数是不是“快乐数”。
一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。
示例:
输入: 19
输出: true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
思路
方法一: 按照题意编程
我们,需要编程尝试:
def getNumbers(self, n):
li = []
while n:
li.append(n - n // 10 * 10)
n = n // 10
return li
def isHappy(self, n):
"""
:type n: int
:rtype: bool
"""
#对n我们需要得到他的各个位
li = self.getNumbers(n)
print(li)
while n!=1:
sum = 0
for i in li:
sum += i*i
li = self.getNumbers(sum)
print(li)
import time
time.sleep(1)
然后输出的结果:
①当测试的数据等于189
[9, 8, 1]
[6, 4, 1]
[3, 5]
[4, 3]
[5, 2]
[9, 2]
[5, 8]
[9, 8]
[5, 4, 1]
[2, 4]
[0, 2]
[4]
[6, 1]
[7, 3]
[8, 5]
[9, 8]
[5, 4, 1]
不难看出这是一个循环
②再次随机取一个数658
[8, 5, 6]
[5, 2, 1]
[0, 3]
[9]
[1, 8]
[5, 6]
[1, 6]
[7, 3]
[8, 5]
[9, 8]
[5, 4, 1]
发现虽然是循环但是,取值的情况真的很多。所以我们不妨,将之加入到列表中,每次判断是否存在。
然后我们的代码如下:
class Solution(object):
def getNumbers(self, n):
li = []
while n:
li.append(n - n // 10 * 10)
n = n // 10
return li
def isHappy(self, n):
"""
:type n: int
:rtype: bool
"""
#对n我们需要得到他的各个位
li = self.getNumbers(n)
result = []
while n!=1:
n = 0
for i in li:
n += i*i
li = self.getNumbers(n)
if li not in result:
result.append(li)
else:
return False
return True
结果:
执行用时 : 36 ms, 在Happy Number的Python提交中击败了80.61% 的用户
内存消耗 : 11.5 MB, 在Happy Number的Python提交中击败了36.44% 的用户
提交时间 | 状态 | 执行用时 | 内存消耗 | 语言 |
几秒前 | 通过 | 36 ms | 11.5MB | python |