202.快乐数
本题的主要思路
- 计算n中每个数字的平方和res;
- 判断res是否是1,进行相应的返回。
上述两个步骤对应的难点
- 如何拆分n,再做平方和?
- 在第二步中,不要只想着判断结果是否为1,它其实包含了一条隐藏信息,就是最后res != 1的时候,意味着结果会从某个值开始进入循环,比如当n=4时,res=16,37,58,89,145,42,20,4,16.....(感兴趣的朋友可以自己算一下)
- 判断当前平方和是否在曾经的结果中出现,若出现且为1,则返回True,不为1,则返回False。若没有出现则继续进行第1步。
解决上述问题的方法
- 拆分n,有两种方法:
- 可以说是 数学方法?通过取余和整除的方法获取各个位置的值:
####方法一
temp = n % 10 # 获取个位
n = (n - temp) // 10 # 将原来的十位移到个位
res += temp ** 2 # 平方个位并相加
####方法二
n, r = divmod(n, 10) #取余和整除的函数,n是整除后得到的返回值,r是余数
res += r ** 2 # 平方个位并相加
2. 将数字变成字符串:
n_str = str(n)
for i in n_str:
res += int(i) ** 2
- 判断结果是否为1。其中包含了不是的话继续给n赋值:
if res == 1:
return True
else:
n = res
- 判断结果是否在之前出现过,可以使用数组或集合存放结果:(当然也有其他循环结构)
#### 方法一
record = []
while n not in record:
record.append(n)
# 省略了中间的其他代码
return False
#### 方法二
record = set()
while n not in record:
record.add(n)
# 省略了中间的其他代码
return False
综上,可得全部代码为: (此处选择了数组)
class Solution:
def isHappy(self, n: int) -> bool:
record = []
while n not in record:
record.append(n)
res = 0
n_str = str(n)
for i in n_str:
res += int(i) ** 2
if res == 1:
return True
else:
n = res
return False
5.两数之和
本题的主要思路是:把在数组nums中遍历过的元素及其下标存入一个字典中,判断在遍历nums剩下的元素时,与target之差是否在字典中出现过。如果出现过就返回对应的下标。
需要熟悉字典的声明、赋值等基本操作。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
record = dict() # 声明一个空字典
# enumerate()用于同时获取列表(或任何可迭代对象)中元素的 索引 和 值。
for index, value in enumerate(nums):
# 当target与当前指针指向的数值的差 之前遍历过(在record中出现过)
while target - value in record:
return [record[target - value], index] # 则返回那个值的下标,和当前数值对应的下标
record[value] = index # 如果没有,则把当前数组中的数值和索引赋值给字典
return [] # 如果没找到任何可匹配的对象则返回空列表
另外,enumerate是Python中的一个内置函数,负责同时获取列表(或任何可迭代对象)中元素的索引和值。

6371

被折叠的 条评论
为什么被折叠?



