代码随想录|242有效的字母异位词,349两个数组交集,202快乐数,1.两数之和

有效的字母异位词

题目链接 leetcode

题目描述: 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

关键点:
字母异位词关注字符串各个字母的频数,而不是字母的序。所以我们可以分别统计两个字符串每个字母的频数,然后进行比较就可知是否为字母异位词。
至于如何统计频数,考虑到这里使用26个字母,且字符串字母顺序不重要,因此我们可以统一使用同一个字母数组。由于26字母ASCII值本身就为连续的,考虑ASCII作为索引。但是数组的索引从0开始,所以我们不需要真的ASCII值,只需要相对’a’的即可。这里 python 中 ord()函数可以返回对应字母的ASCII值。

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        count = [0] *26
        for i in range(len(s)):
            count[ord(s[i])-ord('a')] += 1
        for i in range(len(t)):
            count[ord(t[i])-ord('a')] -= 1
        # count[i] == 0, 则说明两个字符串第i个字母频数相等
        for i in range(26):
            if count[i] != 0:
                return False
        return True

两个数组的交集

题目链接 leetcode

题目描述:给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

该题需要我们去重,也不考虑顺序。这个满足集合的特性,在python中有内置函数 set()可以实现数组到集合的转化。同时 ‘&’ 按位与运算可以作用于集合上实现交集。
Python 代码

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        return list(set(nums1)&set(nums2))

快乐数

题目链接 leetcode

题目描述:
编写一个算法来判断一个数 n 是不是快乐数。

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

该题的关键在于判断过程中是否出现1,以及是否出现循环。显然出现1之后,继续往下也只能得到1。 那么该如何判断是否出现循环呢?
注意到变换规则是一定的,也就是说如果两次输入数一样,那么其每个位置尚的数字平方和也一样,也就意味着后面的所有变换都一样,形成一个循环体。此时问题转化为,在不断快乐转换过程中是否存在两个重复值,一旦重复即可判定为无限循环,且不存在1。当问题涉及到“是否存在于集合中”,我们就该想到哈希表。这里用python中的集合set()实现哈希表。

class Solution:
    def isHappy(self, n: int) -> bool:
        def getSum(n):
            sum = 0
            while(n):
                sum += (n%10)**2
                n //= 10
            return sum
        
        record = set()
        while True:
            sum = getSum(n)
            if sum == 1:
                return True
            if sum in record:
                return False
            else:
                record.add(sum)
                n = sum

两数之和

题目链接: leetcode

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

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

题目要求是否存在两数之和为target,且需要返回它们数组下标。之前我们已经提到过,如果涉及到“是否存在”,我们就可以考虑哈希表的使用。所以如果这道题是判定是否存在,那么我们可以直接用集合来解决。但是题目还要求要返回元素的下标,也就是说不止得判定存在与否,还需要元素的值。那么我们就可以考虑python中的字典。字典是一个无序的键值对结构。因为这里我们判定元素是否在字典里,所以把元素储存于key中,而需要返回下标,所以把下标储存于value之中。
总体的遍历想法:遍历至某一数值时,判定该数值与target差值是否在已遍历过的数值中,若存在,则返回当前遍历数值下标及配对的数值在字典中的value;若不存在,则将该数值作为key放入字典,下标作为value,然后继续向下遍历。

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
		dic = dict()
		for index,value in enumerate(nums):
			need = target - value
			if need in dic:
				return [index,dic[need]]
			dic[need] = index
		return []
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值