重启算法训练第6天 | 202.快乐数、5.两数之和

202.快乐数

本题的主要思路

  1. 计算n中每个数字的平方和res;
  2. 判断res是否是1,进行相应的返回。

上述两个步骤对应的难点

  1. 如何拆分n,再做平方和?
  2. 在第二步中,不要只想着判断结果是否为1,它其实包含了一条隐藏信息,就是最后res != 1的时候,意味着结果会从某个值开始进入循环,比如当n=4时,res=16,37,58,89,145,42,20,4,16.....(感兴趣的朋友可以自己算一下)
  3. 判断当前平方和是否在曾经的结果中出现,若出现且为1,则返回True,不为1,则返回False。若没有出现则继续进行第1步。

解决上述问题的方法

  • 拆分n,有两种方法:
  1. 可以说是 数学方法?通过取余和整除的方法获取各个位置的值:
####方法一
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中的一个内置函数,负责同时获取列表(或任何可迭代对象)中元素的索引。 

    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
    红包 添加红包
    表情包 插入表情
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值