查找1—set\map的使用
1、快乐数(202)
题目描述:
【简单题】
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。
如果 n 是快乐数就返回 True ;不是,则返回 False 。
思路分析:
- 在进行平方和的过程中,不仅需要判断是否最后能得到1,我们还需要找出过程中重复的数字避免进入死循环。
题解一:集合set法
-
首先建立一个集合set,用来装已经算过的数
-
进行一下循环:
- 计算n每一个位置上的数字平方之和,
- 如果平方和等于1,则放回True
- 如果平方和不等于1且未在set集合里出现过,则加入set,并更新n为平方和。
- 如果平方和在set集合里出现过,则说明陷入了循环,返回False
class Solution:
def isHappy(self, n: int) -> bool:
res_table=set()
while 1:#或while True 表示无限循环,不知道循环次数的时候经常用这个
n=[int(i)**2 for i in str(n)]
n=sum(n)#平方和
if n==1:
return True
elif n in res_table:
return False
else:
res_table.add(n)
- 时间复杂度: O ( l o g n ) O(logn) O(logn)
- 空间复杂度: O ( l o g n ) O(logn) O(logn)
小知识点
while 1
和 while True
while 1
和while True
作为无限循环,经常在不知道循环次数的时候使用,并且需要在循环内使用break才会停止。- 在python3中,
while 1
和while True
执行速度一样
2、同构字符串(205)
题目描述:
【简单题】
给定两个字符串 s 和 t,判断它们是否是同构的。
如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。
所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。
思路分析:
- 这道题考察的是一对一映射问题,同样字符只能被同样字符替换,但两个字符不能映射到同一个字符上,但字符可以映射自己本身。
- 同等替换,相当于字典中的键值对问题。因此,我们可以用字典形式解决此题。
题解一:字典map法
-
创建一个空字典
-
把字符串s中的值当作键,把字符串t中的值当作值
-
遍历字符串s、t:
-
如果
s[i]
在字典里键中之前出现过:- 如果
s[i]
所对应的值不等于t[i]
,则违背了所有出现的字符都必须用另一个字符替换,返回False
- 如果
-
如果
s[i]
没有在字典里键中之前出现过:-
如果
t[i]
在字典里的值中,则违背了两个字符不能映射到同一个字符上,返回False
-
否则将
s[i],t[i]
以键值对的形式添加到字典中。
-
-
-
返回
True
class Solution:
def isIsomorphic(self, s: str, t: str) -> bool:
dict={}
for i in range(len(s)):#遍历字符串s,t
if s[i] in dict: #如果该元素之前出过
if dict[s[i]]!=t[i]: #如果之前出现过,但现在对应的值不一样,返回false
return False
else:
if t[i] in dict.values(): #如果该元素在字典的值里,则说明这个字符已经充当一次替换字符了
return False
dict[s[i]]=t[i] # 键值记录在字典中即记录下s[i]所变换后的字母
return True
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( n ) O(n) O(n)
题解二:index
- 如果字符串s和t相对应位置的索引是一致的,那么它们的值肯定是一一对应替换的
class Solution:
def isIsomorphic(self, s: str, t: str) -> bool:
for i in range(len(s)):
if s.index(s[i])!=t.index(t[i]):
return False
return True
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( 1 ) O(1) O(1)
3、有效的字母异位词(242)
题目描述:
【简单题】
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
题目链接
思路分析:
\quad \quad 该题的本质是考察两个字符串的字母种类和字母对应数量是否相同,相同即是有效的字母异位词。比如例1,s字符串和t字符串,a、n、g、r、m的个数均分别为3、1、1、1、1,所以结果为True.
题解一:set集合法
-
如果两字符串s、t的长度不相等,则t肯定不是s的字母异位词,返回False
-
遍历字符串s的集合(去掉重复字母):
- 如果s中每个字母的个数与t中不相等,则返回false
-
除上面的情况外,t是s的有效字母异位词。
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
if len(s)!=len(t):
return False
for i in set(s):
if s.count(i)!=t.count(i):
return False
return True
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( 1 ) O(1) O(1)
题解二:排序法
- 如果两者排序之后相等,那肯定就是真的了
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
return sorted(s)==sorted(t)
- 时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
- 空间复杂度: O ( n ) O(n) O(n)
python 中sorted的时间、空间复杂度,sorted使用的是 Timesort 排序方法
4、单词规律(290)
题目描述:
【简单题】
给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。
这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。
思路分析:
1、此题相当于双射问题,需要判断字符与字符串之间是否恰好一一对应。即任意一个字符都对应着唯一的字符串,任意一个字符串也只被唯一的一个字符对应。
2、我们可以创建两张字典表,存储字符的对应表和字符串的对应表;然后我们枚举每一对字符与字符串的配对过程,不断更新哈希表,如果发生了冲突,则说明给定的输入不满足双射关系。
class Solution:
def wordPattern(self, pattern: str, s: str) -> bool:
word2ch={}
strch={}
words=s.split()
if len(pattern) != len(words):
return False
for ch,word in zip(pattern,words):
if (word in word2ch and word2ch[word] != ch) or (ch in strch and strch[ch] != word):
return False
word2ch[word]=ch
strch[ch]=word
return True
- 时间复杂度: O ( m + n ) O(m+n) O(m+n)
- 空间复杂度: O ( m + n ) O(m+n) O(m+n),m,n分别为两者的长度。