LeetCode之算法面试之查找1之快乐数(202)、同构字符串(205)、有效的字母异位词(242)、单词规律(290)

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 1while True

  • while 1while True作为无限循环,经常在不知道循环次数的时候使用,并且需要在循环内使用break才会停止。
  • 在python3中,while 1while 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分别为两者的长度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值