leetcode笔记|第十五周哈希表

第十五周 哈希表

1 两数之和

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        # 暴力法
        for i in range(len(nums)-1):
            for j in range(i+1,len(nums)):
                if nums[i]+nums[j]==target:
                    return [i,j]
        # 哈希表法
        hashtable = dict()
        for i, ele in enumerate(nums):
            if target-ele in hashtable:
                return [i, hashtable[target-ele]]
            else:
                hashtable[ele] = i

136 只出现一次的数字

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        # 统计出现次数用Counter,key:value是ele:times
        cnt = Counter(nums)
        for i in cnt:
            if cnt[i] == 1:
                return i
        #也可以排序,连续两个不同的就是唯一一个不同的了。

202 快乐数

class Solution:
    def isHappy(self, n: int) -> bool:
        # 无限循环,其实是出现了已经见过的数字,所以用set记录visited
        visited = set()
        # 回溯就是用while,这可太好用了
        while n not in visited and n != 1: # 退出只有两种情况:n为1,或者出现重复
            visited.add(n)
            cnt = 0
            while n:
                cnt += (n%10)**2
                n //= 10
            n = cnt 
        return n==1 # n==1返回true 否则false

299 猜数字游戏

class Solution:
    def getHint(self, secret: str, guess: str) -> str:
        # 妈耶,自己想的,居然AC了
        numa, numb = 0, 0
        tmpa, tmpb = secret, guess
        while secret:
            if secret[-1] == guess[-1]:
                numa += 1
            secret = secret[:-1]
            guess = guess[:-1]
        secret, guess = tmpa,tmpb
        seta, setb = Counter(secret), Counter(guess)
        for i in seta:
            numb += min(seta[i],setb[i])
        res=str(numa)+'A'+str(numb-numa)+'B'
        return res

347 前k个高频元素

class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        numsset = Counter(nums)
        # 对set按照value排序,从大到小是-的
        numsset = sorted(numsset.items(),key = lambda x:-x[1]) 
        return [numsset[i][0] for i in range(k)]

560 和为K的子数组

class Solution:
    def subarraySum(self, nums: List[int], k: int) -> int:
        # 暴力,超时
        # res = 0
        # for i in range(len(nums)):
        #     for j in range(i,len(nums)):
        #         if sum(nums[i:j+1])==k: res+=1
        # return res

        # 如果i到j的和是k,那么sum(0,j)-sum(0,i)=k,也就是说,在j处sum和减k后的sum曾经出现过n次,那么res+=n。
        # 因此,保存前面出现过的和的个数,就可以避免重复计算sum。
        canget = {0:1}
        res = 0
        calsum = 0
        for ele in nums:
            calsum+=ele
            needed = calsum-k
            if needed in canget:
                res += canget[needed]
            # calsum在canget中出现过的次数如果存在就返回这个value,否则返回0
            canget[calsum] = canget.get(calsum,0)+1
        return res

336 回文对

困难,再见👋

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值