代码随想录算法训练营DAY06|哈希表理论基础、242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

哈希表理论基础

  • 一般哈希碰撞有两种解决方法, 拉链法和线性探测法。使用线性探测法,一定要保证tableSize大于dataSize。
  • 当我们要使用集合来解决哈希问题的时候,优先使用unordered_set,因为它的查询和增删效率是最优的,如果需要集合是有序的,那么就用set,如果要求不仅有序还要有重复数据的话,那么就用multiset。
  • 使用哈希表的场景
    • 当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。如果在做面试题目的时候遇到需要判断一个元素是否出现过的场景也应该第一时间想到哈希法!
    • 但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。

242.有效的字母异位词

  • 题目链接:242.有效的字母异位词
  • ord()函数主要用来返回对应字符的ascii码,chr()主要用来表示ascii码对应的字符他的输入时数字
  • 时间复杂度: O(n)、空间复杂度: O(1)(因为定义的是常量大小的数组)
class Solution(object):
    def isAnagram(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """
        record = [0]*26

        for i in s:
            record[ord(i)-ord('a')] += 1
        
        for j in t:
            record[ord(j)-ord('a')] -= 1
        
        for k in record:
            if k!=0:
                return False
        
        return True

349. 两个数组的交集

class Solution(object):
    def intersection(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: List[int]
        """
        max_num = 0

        for num1 in nums1:
            if num1 > max_num:
                max_num=num1

        
        for num2 in nums2:
            if num2 > max_num:
                max_num=num2
        
        record = [0]*(max_num + 1)

        for num1 in nums1:
            record[num1] = 1
        
        for num2 in nums2:
            if record[num2] == 1:
                record[num2] = 2
        
        result = []

        for i in range(len(record)):
            if record[i]==2:
                result.append(i)
        
        return result

202. 快乐数

  • 题目链接:202. 快乐数
  • 判断失败的方法:如果sum出现过则说明陷入死循环
  • 取n各位数字的方法:
	n, r = divmod(n, 10)
	
	for i in str(n):
		sum += int(i)**2
class Solution(object):
    def get_sum(self, n):
        sum = 0

        for i in str(n):
            sum += int(i)**2
        
        return sum

    def isHappy(self, n):
        """
        :type n: int
        :rtype: bool
        """
        record = set()
        new_sum = n
        
        while new_sum not in record:
            record.add(new_sum)
            print(new_sum)
            if new_sum == 1:
                return True
            else:
                new_sum = self.get_sum(new_sum)
        
        return False

1. 两数之和

  • 题目链接:1. 两数之和
  • 本来想用set,觉得不好储存下标就放弃了。最后发现可以用nums.index()直接求下标…
class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        record = [float('inf')]*len(nums)

        for i in range(len(nums)):
            if nums[i] not in record:
                record[i]=target-nums[i]
            else:
                return [record.index(nums[i]), i]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值