代码随想录打卡更新

学习目标:

  • 掌握哈希表理论基础
  • 242有效的字母异位词
  • 349两个数组的交集
  • 202快乐数
  • 1两数之和
  • 收获

学习内容:

有效的字母异位词 

两数之和

用哈希表map做,即python中字典结构;使用key value来存放对应元素(已查询完,且不属于待查询对象元素)及其下标

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        #python中字典对应着哈希表的map,这里要查询一个字符是否属于map中,这里使用字典结构
        res = dict()
        for index, n in enumerate(nums):
            if target - n in res:
                return list([index, res[target-n]])
            else:
                res[n] = res.get(n, index)
  • 为什么会想到用哈希表
  • 哈希表为什么用map
  • 本题map是用来存什么的
  • map中的key和value用来存什么的

202. 快乐数

class Solution:
    # 解法一:(自己写)
    # def sum(self, n: int) -> int:
    #     sums = 0
    #     while n != 0:
    #         sums += (n % 10) * (n % 10)
    #         n = n // 10
    #     return sums
    def isHappy(self, n: int) -> bool:
    #     table = {}
    #       报错int不能迭代,因为def sum(n):写成def sum(self, n: int) -> int:
    ##     sums = sum(n)
    #     sums = self.sum(n)
    #     while sums != 1:
    #         table[sums] = table.get(sums, 0) + 1
    #         n = sums
    #         sums = self.sum(n)

    #         # 防止陷入死循环
    #         lists = list(table.values())
    #         if 2 in lists:
    #             return False
    #     # lists = list(table.values())
    #     # for i in lists:
    #     #     if i > 1:
    #     #         return False
    #     return True

    # 集合(看的答案)
    # 注意这里元素和计算出来之后需要更新n
        record = set()
        while True:
            nums = self.get_sum(n)
            n = nums
            if nums == 1:
                return True
            if nums in record:
                return False
            else:
                record.add(nums)
                
    def get_sum(self, n: int) -> int:
        num = 0
        while n:
            # 商,余数 = divmod(被除数,除数)
            n, r = divmod(n, 10)
            num += r * r
        return num

349两个数组的交集

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        # # 鼓捣半天以为python中的哈希表是有专门的调用函数,
        # table = {}
        # for i in nums1:
        #  掌握一个字典赋值初始化的方法
        #     table[i] = table.get(i, 0) + 1
        # res = set()
        # for num in nums2:
        #     if num in table:
        #         res.add(num)
        #         del table[num]
        # return list(res)

        # 解法二 感觉好简便
        return list(set(nums1) & set(nums2))

有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

示例 1:

输入: s = "anagram", t = "nagaram"
输出: true

示例 2:

输入: s = "rat", t = "car"
输出: false

提示:

  • 1 <= s.length, t.length <= 5 * 104
  • s 和 t 仅包含小写字母
  • class Solution:
        def isAnagram(self, s: str, t: str) -> bool:
            # # 朴实无华的使用字典记录一个字符串的每一个元素的出现次数
            # dicts = {}
            # # 这步是字典的初始化,不然记录不了
            # for i in s:
            #     dicts[i] = 0
            # for i in s:
            #     dicts[i] += 1
            # for key in dicts.keys():
            #     count = 0
            #     for j in t:
            #         if j == key:
            #             count += 1
            #     if count != dicts[key]:
            #         return False
            # return True
    
            # 下面是使用哈希表方法做的
            record = [0]*26
            for i in s:
                record[ord(i) - ord("a")] += 1
            for j in t:
            # TypeError: 'builtin_function_or_method' object is not subscriptable
            # record[ord[j] - ord("a")] -= 1
                record[ord(j) - ord("a")] -= 1
            for q in range(26):
                if record[q] != 0:
                    return False
            return True

    收获:

  • divmod(被除数,除数)函数,返回一个包含商和余数的元组(a//b, a%b);

        只能接受整数或浮点数类型的参数

        divmod函数的返回值类型是元组

python 字典get函数

利用键获取值
        dict[key]
        dict.get(key)
                利用get()函数操作时当字典中不存在输入的键时会返回一个None,这样程序运行时就不会出异常
利用字典统计列表中元素出现次数:
cou[i]=cou.get(i,0)+1 #之后称其为get的赋值语句,目的是新建字典键值对;该语句连续运行两次,每次的结果都不一样;
第一次是此时get语句的功能为赋初值,即把键’aa’的初值置为0然后加1;
第二次:cou[i]=cou.get(i,0)+1(i=‘aa’);因get语句已经作为赋值语句出现过一次了,因此此时再执行这条语句时,赋值功能已经无效了,也就是get语句里第二个参数对’aa’这个键已经无效了,此时get语句的功能为文章内的第一大部分所介绍的功能,所以这条语句此时可等价为
cou[i]=cou.get(i)+1
以列表返回字典中的所有值:values()方法:
        scores_dict = {'语文': 105, '数学': 140, '英语': 120}
        print(scores_dict.values())  # 输出 dict_values([105, 140, 120])
字典初始化:
dict();
字典同时遍历key和value:
#function1
for key,value in dict.items():
    print ('key: ',key,'value: ',value)
------------------------
key:  小明 value:  129
key:  小兰 value:  148
key:  小红 value:  89
 
 
#function2
for (key,value) in dict.items():
    print ('key: ',key,'value: ',value)
------------------------
key:  小明 value:  129
key:  小兰 value:  148
key:  小红 value:  89
 
 
#function3
for kv in dict.items():
    print ('kv is : ',kv)
------------------------
kv is :  ('小明', 129)
kv is :  ('小兰', 148)
kv is :  ('小红', 89)
 
----------------------结合zip使用---------------------
#function4
for key,value in zip(dict.keys(), dict.values()):
    print ('key:',key,'value: ',value)
    print('type key:',type(key),'type value:',type(value))
------------------------
key: 小明 value:  129
type key: <class 'str'> type value: <class 'int'>
key: 小兰 value:  148
type key: <class 'str'> type value: <class 'int'>
key: 小红 value:  89
type key: <class 'str'> type value: <class 'int'>
 
#function5
for kv in zip(dict.keys(), dict.values()):
    print ('kv: ',kv)
    print('type:',type(kv))
------------------------
kv:  ('小明', 129)
type: <class 'tuple'>
kv:  ('小兰', 148)
type: <class 'tuple'>
kv:  ('小红', 89)
type: <class 'tuple'>

集合:
类别代码随想录中的哈希数据结构,简单记录一下自己的学习心得

定义及特点:python中set是一个无序不重复的序列,set的主要作用是用来给数据去重。集合的定义方式:sets = set('s', 'q', 1, 3, 5)或者sets = {'s', 'q', 1, 3, 5} ;注意若是定义一个空集合必须使用set()而不是{},因为{}是用来表示空字典类型的;

  • 不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);
  • 可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。

集合使用:创建及初始化;增删查改;
 

定义及初始化

# 使用{}进行初始化定义(非空集合),存贮会自动去重
q = {}   

# 空集合用set()函数表示
q = set()

# 使用set()创建集合,即可以自动将其他数据结构转化成集合
q = set(("hello","jerry",133,11,133,"jerru")) #只能传入一个参数,可以是list,tuple等 类型
print(len(q))
print(q)
'''
输出:
5
{133, 'jerry', 11, 'jerru', 'hello'}

增删查改:

person.add("student") #如果元素已经存在,则不报错,也不会添加,不会将字符串拆分成多个元素,去别update

person.update("abc") #可以使用update添加一些元组列表,字典等。但不能是字符串,否则会拆分,#会将字符串拆分成a,b,c三个元素

person.remove("student")#按元素去删除,如果不存在 ,会报错
person.discard("student")#功能和remove一样,好处是没有的话,不会报错

#4.查询是否存在,无法返回索引,使用in判断
if "teacher" in person:
    print("true")


学习时间:

这次花费的时间有点长两天?三天?


学习产出:

python哈希表主要说的是set()和字典dict()

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值