242.有效的字母異位詞
題目鏈接:
242. 有效的字母異位詞 - 力扣(Leetcode)
給定兩個(gè)字符串 s 和 t 鲸湃,編寫(xiě)一個(gè)函數(shù)來(lái)判斷 t 是否是 s 的字母異位詞胞四。
注意:若 s 和 t 中每個(gè)字符出現(xiàn)的次數(shù)都相同统锤,則稱(chēng) s 和 t 互為字母異位詞。
收獲的點(diǎn):
1) python的collections模塊:
collections模塊實(shí)現(xiàn)了特定的數(shù)據(jù)容器,以提供Python標(biāo)準(zhǔn)內(nèi)建容器 dict , list , set , 和 tuple 的替代選擇猎荠。
這篇((54條消息) Python模塊-collections_紅鯉魚(yú)與綠驢的博客-CSDN博客
)寫(xiě)的特別完整
以Counter函數(shù)為例
Counter是dict的一個(gè)子類(lèi)伊磺,用于對(duì)可哈希對(duì)象進(jìn)行計(jì)數(shù)。
from collections import Counter
a = Counter(['a', 'b', 'c', 'a', 'b', 'a']) # 使用列表初始化計(jì)數(shù)器
b = Counter(('a', 'b', 'c', 'a', 'b', 'a')) # 使用元組初始化計(jì)數(shù)器
c = Counter("Hello") # 使用字符串初始化計(jì)數(shù)器
d = Counter({'a': 3, 'b': 2, 'c': 1}) # 使用字典手動(dòng)地告訴計(jì)數(shù)器的值
e = Counter(a=3, b=2, c=1) # 使用關(guān)鍵字參數(shù)
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})
更新計(jì)數(shù)
from collections import Counter
a = Counter("Hello")
a.update({'e': 2, 'o': 4}) # 更新計(jì)數(shù)器
b = a.most_common(2) # 取出頻率最高的2個(gè)值
print(a)
print(a['e']) # 訪問(wèn)計(jì)數(shù)器
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函數(shù)以后這個(gè)題目的答案就非常容易了:
完整代碼:
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
#思路:將s和t轉(zhuǎn)化為兩個(gè)字典酒奶,字典的key是元素蚁孔,value是元素出現(xiàn)的次數(shù)。如果兩個(gè)字典的key惋嚎,value相等杠氢,返回就是字母異位詞。
s1 = Counter(s)
t1 = Counter(t)
return s1 == t1
349. 兩個(gè)數(shù)組的交集
題目鏈接:349. 兩個(gè)數(shù)組的交集 - 力扣(Leetcode)
給定兩個(gè)數(shù)組 nums1 和 nums2 另伍,返回 它們的交集 鼻百。輸出結(jié)果中的每個(gè)元素一定是 唯一 的。我們可以 不考慮輸出結(jié)果的順序 摆尝。
收獲的點(diǎn):
1.&符號(hào)為取交集温艇,相當(dāng)于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為更長(zhǎng)的數(shù)組
res = []
for i in nums1:
if i in nums2 and i not in res:
res.append(i)
return res
202. 快樂(lè)數(shù)
題目鏈接:
代碼隨想錄 (programmercarl.com)
編寫(xiě)一個(gè)算法來(lái)判斷一個(gè)數(shù) n 是不是快樂(lè)數(shù)。
「快樂(lè)數(shù)」 定義為:
對(duì)于一個(gè)正整數(shù)堕汞,每一次將該數(shù)替換為它每個(gè)位置上的數(shù)字的平方和勺爱。
然后重復(fù)這個(gè)過(guò)程直到這個(gè)數(shù)變?yōu)?1,也可能是 無(wú)限循環(huán) 但始終變不到 1讯检。
如果這個(gè)過(guò)程 結(jié)果為 1琐鲁,那么這個(gè)數(shù)就是快樂(lè)數(shù)。
如果 n 是 快樂(lè)數(shù) 就返回 true 人灼;不是围段,則返回 false 。
有想到中間進(jìn)行判斷投放,并且用while奈泪,但是while 條件是 != 1這個(gè)點(diǎn)當(dāng)時(shí)沒(méi)考慮清楚。喜歡這種有意思的題。
完整代碼:
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 兩數(shù)之和
題目鏈接:
1. 兩數(shù)之和 - 力扣(Leetcode)
給定一個(gè)整數(shù)數(shù)組 nums 和一個(gè)整數(shù)目標(biāo)值 target段磨,請(qǐng)你在該數(shù)組中找出 和為目標(biāo)值 target 的那 兩個(gè) 整數(shù)取逾,并返回它們的數(shù)組下標(biāo)。
你可以假設(shè)每種輸入只會(huì)對(duì)應(yīng)一個(gè)答案苹支。但是砾隅,數(shù)組中同一個(gè)元素在答案里不能重復(fù)出現(xiàn)。你可以按任意順序返回答案债蜜。
最終還是想到最初用的兩層for循環(huán)晴埂,不過(guò)這次能很快想清楚里面的邏輯。
完整代碼:
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]
一個(gè)更好的解法:
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)返回索引