2022-12-12Day6 |242.有效的字母异位词 | 1. 两数之和 202. 快乐数 349. 两个数组的交集

242.有效的字母异位词

题目链接:

242. 有效的字母异位词 - 力扣(Leetcode)
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

收获的点:

1) python的collections模块:
collections模块实现了特定的数据容器,以提供Python标准内建容器 dict , list , set , 和 tuple 的替代选择。
这篇((54条消息) Python模块-collections_红鲤鱼与绿驴的博客-CSDN博客
)写的特别完整
以Counter函数为例
Counter是dict的一个子类,用于对可哈希对象进行计数。

from collections import Counter

a = Counter(['a', 'b', 'c', 'a', 'b', 'a'])  # 使用列表初始化计数器
b = Counter(('a', 'b', 'c', 'a', 'b', 'a'))  # 使用元组初始化计数器
c = Counter("Hello")  # 使用字符串初始化计数器
d = Counter({'a': 3, 'b': 2, 'c': 1})  # 使用字典手动地告诉计数器的值

e = Counter(a=3, b=2, c=1)  # 使用关键字参数

print(a)
print(b)
print(c)
print(d)
print(e)

# 输出
Counter({'a': 3, 'b': 2, 'c': 1})
Counter({'a': 3, 'b': 2, 'c': 1})
Counter({'l': 2, 'H': 1, 'e': 1, 'o': 1})
Counter({'a': 3, 'b': 2, 'c': 1})
Counter({'a': 3, 'b': 2, 'c': 1})

更新计数

from collections import Counter

a = Counter("Hello")
a.update({'e': 2, 'o': 4})  # 更新计数器
b = a.most_common(2)  # 取出频率最高的2个值

print(a)
print(a['e'])  # 访问计数器
print(b)
for i in "Hello":
    print(i, a[i])

# 输出
Counter({'o': 5, 'e': 3, 'l': 2, 'H': 1})
3
[('o', 5), ('e', 3)]
H 1
e 3
l 2
l 2
o 5

明白Counter函数以后这个题目的答案就非常容易了:

完整代码:

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        #思路:将s和t转化为两个字典,字典的key是元素,value是元素出现的次数。如果两个字典的key,value相等,返回就是字母异位词。
        s1 = Counter(s)
        t1 = Counter(t)
        return s1 == t1

349. 两个数组的交集

题目链接:349. 两个数组的交集 - 力扣(Leetcode)

给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

收获的点:

1.&符号为取交集,相当于intersection

return [set(nums1) & set(nums2)]
return [set(nums1).intersection(set(nums2)]

2.善用列表解析式

return [ i for i in set(nums1) and i in set(nums2)]

解题代码:

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        s1 = len(nums1)
        s2 = len(nums1)
        if s1< s2:
            nums1 = nums2
            s1 = s2
        #让s1为更长的数组
        res = []
        for i in nums1:
            if i in nums2 and i not in res:
                res.append(i)
        return res

202. 快乐数

题目链接:

代码随想录 (programmercarl.com)
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

image.png

有想到中间进行判断,并且用while,但是while 条件是 != 1这个点当时没考虑清楚。喜欢这种有意思的题。

完整代码:

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

1 两数之和

题目链接:

1. 两数之和 - 力扣(Leetcode)
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。

最终还是想到最初用的两层for循环,不过这次能很快想清楚里面的逻辑。

完整代码:

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        for i in range(len(nums)):
            for j in range(i+1,len(nums)):
                if nums[i] + nums[j] == target:
                    return [i,j]

一个更好的解法:

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        hashtable = {}
        for i,num in enumerate(nums):
            hashtable[num] = i 

        for j, x in enumerate(nums):
            i = hashtable.get(target-x)
            if i != None and i != j:
                return [j,i]

先建立字典,再查询字典,使用了字典查询dict.get(x)返回索引

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容