zoukankan      html  css  js  c++  java
  • 算法之dict

    字典的本质:
        其内部是一个数组
        将 key 通过一个hash function 计算出一个整数, 让后将计算出一个整数%数组长度求余
        得出index, 将value存入该index对应的地址中
    
        set 只有key, 没有value的dict.
        对于dict, 所有的操作的时间复杂度都是O(1), 但是空间复杂度为O(n)
    
        对于题目中出现:
            计数
            有没有出现过(set)
            有没有重复
        以上字眼可以考虑使用dict
        dict中可存入 <key, 次数> 和 <key, 索引>
    
    1. 计数字符串中字符出现的次数
        def letter_count(s):
            freq = {}
            for i in s:
                if i.isalpha():
                    freq[i] = 1 + freq.get(i, 0)
            return freq
    
    2. 找出字符串中字符出现次数最大的字符
        思路: 先计算, 再遍历
    
        def max_letter_count(s):
            freq = {}
            for i in s:
                if i.isalpha():
                    freq[i] = 1 + freq.get(i, 0)
            max_count = 0
            max_letter = 0
            for key, val in freq.items():
                if val > max_count:
                    max_count = val
                    max_letter = key
            return max_letter,max_count
    
    3. 找出字符串第一个没有重复出现的字符,并返回字符所在是位置(索引)
        如: s = 'givenastring' 字符v是第一没有重复的字符, 所以
        思路: 先使用dict对字符串中每一个字符计数
             然后遍历字符串, 当该字符出现的次数为1时,则返回索引
        def first_unqie_letter(s):
            freq = {}
            for i in s:
                if i.isalpha():
                    freq[i] = 1 + freq.get(i, 0) # 计数
            for i in range(len(s)):
                if freq.get(s[i]) == 1: # 出现1则返回
                    return i
            return -1
    
    4. 找出两个数组中的公共元素
        思路: 将数组1存入set中, 遍历数组2, 判断每一个元素是否在数组1中出现过
        def intersection(arra1, arra2):
            a1 = set(arra1)
            ret = []
            for i in arra2:
                if i in a1:
                    ret.append(i)
            return ret
    
        使用python中set的特性, 一句代码: set(arra1) & set(arra2)
    
    5. 计数字符串s1中的字符在字符串s2出现的次数和
        比如: s1 = 'aA' s2 = 'aAAbbb' 输出 3
             s1 = 'z' s2 = 'ZZ' 输出 0
        思路: 暴力解法, 两层for循环
        def count_letter(s1, s2):
            count=0
            for i in s1:
                for j in s2:
                    if i == j:
                        count += 1
            return count
        使用set降低时间复杂度
        def count_letter(s1, s2):
            count=0
            s = set(s1)
            for i in s2:
                if i in s:
                    count += 1
            return count
    
    6. 判断一个字符串中是否有重复的字符
        思路1: 将字符串放入set后的长度和字符串的长度将那些比较是否相等
        def is_contains_duplicate(s):
            return not (len(s) == len(set(s)))
    
        思路2: 使用dict存储key,count, 出现count = 2,则返回False
        def is_contains_duplicate(s):
            d = {}
            for index, value in enumerate(s):
                # 对于一边存储一边判断(累计求值, 比如求和等)的,一定要先进行存储, 再进行判断
                d[value] = 1 if value not in d else d[value] + 1
                if value in d and d.get(value) >= 2:
                    return True
            return False
    
    7. 判断一个字符串中是否有重复的字符, 并且重复字符所在索引的差小于等于k
        思路: for 循环时借助dict进行判断, 如果再dict不存在则存入,
            如果存在则进行判断
        def is_contain_duplicate(s, k):
            d = {}
            for idx, val in enumerate(s):
                if val in d and (idx - d.get(val)) >= k:
                    return True
                else:
                    # 判断是否存在val, 如果不进行判断对 s='aaba' ,k = 3这样的则有问题
                    if val not in d:
                        d[val] = idx
            return False
  • 相关阅读:
    C# WebSocket 实现客户端和服务端的通信(二)
    C# WebSocket 实现客户端和服务端的通信(一)
    regsvr32 将dll写入注册表
    Dictionary 添加重复的键值对
    C# Math.Round()的银行家算法
    DataGridView 合并数据相同的行
    获取系统当前日期,分布获取年月日和时分秒
    [Err] ORA-00923: 未找到要求的 FROM 关键字
    正则表达式常用的字符类
    Spring注解作用
  • 原文地址:https://www.cnblogs.com/yaoqingzhuan/p/12688301.html
Copyright © 2011-2022 走看看