目录
242.有效的字母异位词
题目链接:
题目描述:
给定两个字符串 s
和 t
,编写一个函数来判断 t
是否是 s
的字母异位词。
注意:若 s
和 t
中每个字符出现的次数都相同,则称 s
和 t
互为字母异位词。
解题思路:
排序法:
使用sort排序后,对比每一位是否相同。
哈希法:
使用额外的空间存放哈希表 [0]*26,先遍历一个字符串,将其中字母出现次数记录在哈希表中 ord(i)-ord('a'),再遍历下一个字符串,将其中出现的字符次数在哈希表中-1。最后判断哈希表是否全为0,若为0则返回True ,若不为False。
代码:
排序法:
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
s = list(s)
s.sort()
t = list(t)
t.sort()
sizes = len(s)
sizet = len(t)
if sizes != sizet:
return False
else:
for i in range(sizes):
if s[i] != t[i]:
return False
else:
return True
哈希法:
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
nums_s = [0] * 26
for i in s:
nums_s[ord(i) - ord('a')] += 1
for i in t:
nums_s[ord(i) - ord('a')] -= 1
if nums_s == [0] * 26:
return True
else:
return False
349. 两个数组的交集
题目链接:
题目描述:
给定两个数组 nums1
和 nums2
,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
解题思路:
暴力法:
双层for循环,这里就不展开讲了。
哈希法:
使用列表储存nums1中元素是否出现,与nums2中对比,若在nums2中也有出现,则使用集合(防止记录出现的元素。
集合法:
直接解出来,但不了解底层逻辑的不建议使用。
代码:
哈希法:
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
nums = [0] * 1001
res = set()
for i in nums1:
nums[i] = 1
for i in nums2:
if nums[i] == 1:
res.add(i)
return list(res)
集合法:
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
return list(set(nums1) & set(nums2))
202. 快乐数
题目链接:
题目描述:
编写一个算法来判断一个数 n
是不是快乐数。
「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n
是 快乐数 就返回 true
;不是,则返回 false
。
解题思路:
哈希法:
使用集合储存每次计算出的的平方和,
若平方和为1,则返回True。
并使用新计算出的平方和与之对比(if sum in record),若在集合中,则说明是死循环,返回False。
代码:
class Solution:
def isHappy(self, n: int) -> bool:
record = set()
while True:
sum = 0
while n:
n, r = divmod(n, 10)
r = r**2
sum += r
n = sum
if sum == 1:
return True
if sum in record:
return False
else:
record.add(sum)
1. 两数之和
题目链接:
题目描述:
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
解题思路:
哈希法:
使用一个字典储存已经遍历过的元素,并在遍历数组的时候,只需要向字典查询是否有和目前遍历元素匹配的数值,如果有,就找到的匹配对,如果没有,就把目前遍历的元素放进字典中,因为字典存放的就是我们访问过的元素。
代码:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
records = dict()
for index, value in enumerate(nums):
if target - value in records: # 遍历当前元素,并在map中寻找是否有匹配的key
return [records[target- value], index]
records[value] = index # 如果没找到匹配对,就把访问过的元素和下标加入到map中
return []