Leetcode编程实践-查找

本文深入探讨了数据结构如set、dict和map在LeetCode题目中的应用,包括有效的字母异位词、快乐数、单词规律及根据词频排序等问题的解决策略。通过对这些题目的解析,读者将理解如何利用数据结构提高算法效率。
摘要由CSDN通过智能技术生成

3.1 考虑的基本数据结构

第一类:查找有无–set
某元素是否存在:集合
set只储存键,而不需要对应相应的值,set中的键不允许重复。
第二类:查找对应关系(键值对应)–dict
某元素出现了几次:dict
dict中的键不允许重复
第三类:改变映射关系–map
通过将原有序列的关系映射统一表示为其他

3.2 算法应用

leetcode242 有效的字母异位词

示例 1:
输入: s = “anagram”, t = “nagaram”
输出: true

【思路】
两个词需要每个字母出现的次数都一样,需要使用字典统计词频,使用collections.Counter实现:

from collections import Counter # 统计词频
class Solution: 
    def isAnagram(self, s: str, t: str) -> bool:
        return Counter(s)==Counter(t)

leetcode202 快乐数

编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。
如果 n 是快乐数就返回 True ;不是,则返回 False 。
示例:
输入:19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

【思路】:
如何判断false?当n重复出现的时候就会无限循环,因此只要新的n之前出现过,就可以返回False,出现问题用集合set(列表也行)

class Solution:
    def isHappy(self, n: int) -> bool:
        tmp=set()
        while n!=1:
            n=sum([int(i)**2 for i in str(n)])
            if n in tmp: 
                return False
            else:
                tmp.add(n)
        return True

tips

#一般对多位数计算的套路是: 
#循环从后向前取位数
while n >0 :
	#取最后一位:
	tmp = n % 10 
	#再截掉最后一位: 
	n = n // 10

leetcode290 单词规律

给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。
这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。
示例1:
输入: pattern = “abba”, str = “dog cat cat dog”
输出: true

【思路】
通过位置索引的映射,来判断是否相同
例如’abba’, 'a’的位置为0,‘b’的位置为1,映射为’0110’

class Solution:
    def wordPattern(self,pattern, str):
		str = str.split()
		return list(map(pattern.index,pattern)) == list(map(str.index,str))

leetcode451 根据词频排序

输入:
“tree”
输出:
“eert”
解释:
'e’出现两次,'r’和’t’都只出现一次。
因此’e’必须出现在’r’和’t’之前。此外,"eetr"也是一个有效的答案。

【思路】
根据词频逆序输出,counter获取词频dict,对dict进行排序:

class Solution:
    def frequencySort(self, s: str) -> str:
        from collections import Counter
        dic=Counter(s) # 获得词频统计字典
        # 对字典进行排序 sorted返回元组!!
        dic=sorted(dic.items(), key=lambda x:x[1], reverse=True)
        l=[k*v for k,v in dic]
        return ''.join(l)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值