day6 代码随想录 | 1 两数之和 202 快乐数 349两个数组交集

两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

这个题目不难,暴力解法就是双循环。我们也会想到用python的字典来介绍复杂度。

朴素的想法就是target-num去字典里面去寻找,如果能找到,那就返回对应的值。

字典里面存储上key是num, value是num的索引 index。思路很简单。但问题在于,我们是一开始就是直接存上字典,然后再遍历字典找吗? 我第一次做的时候就是这样,可以看一下的错误代码。

def twoSum(nums: List[int], target: int):
    dic1 = {}
    for index, num in enumerate(nums):
        dic1[num] = index

    for k, v in dic1.items():
        if dic1.get(target-k, -1) >= 0:
            [v, dic1.get(target-k)]
    return []

那么,这个问题在哪里呢? 我们举一个简单的例子,假设是nums=[3, 3],target = 6。 按照我的想法,当我们遍历到3的时候,应该返回索引为1的3。但是你是字典,你按照key取值,那么当你初始化相同的key后,直接覆盖率了一个索引,你得到的字典只有一个 3:1。最后,你返回的是3,3。那么假设是nums=[3, 2],target = 6,同样的道理,你会返回[0, 0]. 本来应该是找不到的。

其实问题就在于,你不应该直接就初始化字典。因此你在遍历字典的时候,你根本无法保证你取的target-num的值是否已经访问过了,你不能保证说你在访问num的时候,你取的key不知你自己本身的num的值。这就是问题所在。

正确方法应该是,我在遍历数组的时候,访问的target-num是再已经访问的num的字典里面去找。这样就保证,这是两个不同的数再相加!正确代码如下。

def twoSum(nums: List[int], target:int):
    dic1 = {}
    for num, index in enumerate(nums):
        # dic1[num]= index 不能一进入循环就赋值字典 这样会导致两个重复的数相加
        if (target-num) in dic1:
            return [index, dic1.get(target-num)]
        dic1[num]=index 
    return []

快乐数

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。

如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

这个题就是按照题意去做就可以了。但是你需要明确循环的中止条件。

当快乐数的结果不为1时,将结果记录下来,如果后面的结果发现重复了之前的结果,就跳出循环,说明没有找到。

def isHappy(n: int) -> bool:
    record = []
    while n not in record:
        record.append(n)
        new_num = 0
        n_str = str(n)
        for i in n_str:
            new_num += int(i)**2
        if new_num == 1: return True
        else: n = new_num
    return False
        
    

两个数组的交集

给定两个数组  nums1 和  nums2 ,返回  它们的  交集

输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]

这个题目可以看作是两数之和的减配版本。我们需要构建一个数组的字典,然后遍历另一个数组,看数组的num是否在构造的字典中。但是要考虑到去重的问题,我这里就是如果添加到数组,然后将该num的value值赋值为-1

def intersection(nums1: List[int], nums2: List[int]) -> List[int]:
    dic1 = {}
    for i in nums1:
        dic1[i] = dic1.get(i, 0) + 1
    res = []
    for j in nums2:
        if dic1.get(j, 0) > 0:
            res.append(j)
            dic1[j] = -1
    return res
            
    

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值