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)