代码随想录算法训练营第五天|1.两数之和,202.快乐数,242.有效的字母异位词,349.两个数组的交集

文档参考:programmercarl.com

242.有效的字母异位词

这个题吧,一看就知道肯定可以用暴力法来做,代码也很简单

class Solution(object):
    def isAnagram(self, s, t):
        for i in range(97, 123): # 小写字母的ASCLL码值为97-123
            if self.num(s, chr(i)) != self.num(t, chr(i)): # 判断两个字符串中的字母数量是否相同
                return False
        return True

    def num(self, string, tar): # 计算字符串中的字母的数量
        sum = 0 # 数量
        for i in range(len(string)):
            if string[i] == tar:
                sum += 1
        return sum

但是既然是学算法,那么肯定要追求更快的速度,所以这道题就用到了我今天刚学的哈希表,将每个小写字母按顺序映射成数组的索引,使该数组成为一张哈希表;然后就可以利用该哈希表记录其中一个字符串的每个小写字母的值,然后再与另一个字符串作比较;

其中哈希表(数组)的索引0 ~ 25正好对应a ~ z;

# 现在就是哈希表法
# 对于有一定规律的数据,可以用数组的索引来记录真实的数据,然后数组的值对应数据的数量
class Solution_1(object):
    def isAnagram(self, s, t):
        record = [0] * 26
        for i in s: # 统计s字符串的每个值的数量
            record[ord(i) - ord("a")] += 1
        for i in t: # 统计t字符串的每个值的数量
            record[ord(i) - ord("a")] -= 1

        for i in range(26):
            if record[i] != 0:
                return False
        return True

349.两个数组的交集

这道题让我们求两个数组之间的交集,然后交集中不能有重复的值;要求快速在数组中找出需要的值,还要保证不重复,所以这里采用的是集合方式编写代码;

首先将一个数组中的所有值以[key, value]的形式记录到哈希表中,因为哈希表讲究唯一的映射值,所以key也只能有一个,然后判断第二个数组中的值是否在该哈希表中,如果在该表中能够找到匹配项,说明这个数是两个数组的交集,就将它添加到集合当中,同时删除哈希表中对应的值,防止下次继续添加

"""
哈希表在python中的体现就是字典
利用字典的键存储重复出现的数据,字典的值记录出现的次数
"""
class Solution(object):
    def intersection(self, nums1, nums2):
        # 先利用哈希表存储一个数组中的所有元素
        table = {}
        for num in nums1:
            table[num] = table.get(num, 0) + 1
        # get方法用于在字典中查找键值,如果没有查到就输出默认值0

        # 然后使用集合存储结果
        res = set()
        for i in nums2:
            if table.get(i) != None:
                res.add(i)
                # 为了保证独立性,需要删除之前已经添加进集合中的键值
                del table[i]

        return list(res)

202.快乐数

这道题,我看题目是没想出思路来,感觉很像数学题,因为能够无限循环下去,所以当第二次出现相同值的时候,说明正在循环没有结果,所以只需要用哈希表记录每次相加的和就行,然后不断匹配即可

class Solution(object):
    def isHappy(self, n):
        # 由于结果为1的情况就是集合中只有0和1存在
        res = set() # 创建一个集合用来存储所有的结果
        sum = 0
        while True:
            for i in str(n):
                sum += int(i) ** 2 # 计算总和
            if sum == 1: # 当总和为1时返回True
                return True
            if sum in res: # 当总和再一次重复时,说明不是快乐数
                return False
            else:
                res.add(sum) # 将数据添加到集合中,继续下次计算
            n = sum
            sum = 0

1.两数之和

作为leetcode上的第一题,为表敬意,先暴力下先,两个for循环,很简单

"""
遇事不决先暴力
"""
class Solution(object):
    def twoSum(self, nums, target):
        for i in range(len(nums) - 1):
            for j in range(i + 1, len(nums)):
                if nums[i] + nums[j] == target:
                    return [i, j]
        return None

但是学了算法,就还得用算法来解决嘛,这里用到的是map方法,利用[key, value]来记录[数值,数组索引],这题和349有点像,关键在于利用key可以被快速检索的性质,一般的数组是我们可以通过索引来快速查找对应下标的数据,这里的话就反过来,因为我们需要快速查找需要的数据,利用真实数据来查是手段,找对应下标是结果,所以这个哈希表对于数组相当于反过来,用key保存数据,用value保存下标,然后我们利用key(相当于数组的索引)来快速搜索,搜到之后再吐出value(相当于数组保存的值)

# map方法
# 利用map存储键值对,以key,value的形式保存所谓的值
class Solution_1(object):
    def twoSum(self, nums, target):
        record = dict() # 字典(哈希表)

        for index, value in enumerate(nums): # 记录数组的键值对
            if target - value in records: # 利用减法反求需要的数
                return [record[target - value], index] # tar - val是实际的值,record[tar - val]就是指索引
            record[value] = index # 将索引添加到哈希表中
        return []

还行,感觉哈希表吧,还是有点抽象(摊手)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值