leetcode 242.有效的字母异位词
题目
242.有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
解题思路
1、判断元素是否出现过 --使用哈希法
2、哈希法选择哪种数据结构
哈希值小时选数组list,哈希值大时选集合set,哈希值涉及key、value时选字典dict
本题字符串s和t仅包含小写字母,哈希值最多26个小写字母,哈希法数据结构选数组list
4、怎么用数组list解题
(1) 定义一个长度为26的数组arr存放26个小写字母,a-z对应的数组下标为0-25,每个字符对应的值为0
(2) 遍历字符串s,s中的字符i在arr中出现1次,arr中字符i的值就加1
(3) 遍历字符串t,t中的字符和s中的字符如果一样,每出现1次,arr中字符i的值就-1
(4) 最后遍历arr中每个字符,如果所有字符的值都为0,则s和t互为字母异位词
实现代码
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
arr = [0] * 26 # 定义长度为26的数组,存放26个小写英文字母(a-z,对应的数组下标为0-25)
for i in s: # 遍历字符串s中的字符
arr[ord(i) - ord('a')] += 1 # 字符串s中的字符i,在数组arr中每出现1次就+1
for i in t: # 遍历字符串t中的字符
arr[ord(i) - ord('a')] -= 1 # 字符串t中的字符i,在数组arr中每出现1次就-1
for i in range(26):
'''
如果字符i在s中出现的次数和在t中出现的次数一样,arr[i] = 0,字符串s和互为异位词
如果字符i在s中出现的次数>在t中出现的次数,arr[i] > 0,字符串s和t不是异位词
如果字符i在s中出现的次数<在t中出现的次数,arr[i] < 0,字符串s和t不是异位词
'''
if arr[i] != 0:
return False
return True
test = Solution()
s = 'aabc'
t = 'car'
print(test.isAnagram(s, t))
leetcode 349.两个数组的交集
题目
349.两个数组的交集
给定两个数组 nums1 和 nums2 ,返回 它们的交集。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
解题思路
set集合中的元素无序不重复,可以进行交集、并集、差集操作
把两个数组转换成set集合,对两个set集合求交集,set交集结果再转换为数组
实现代码
from typing import List
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
return list(set(nums1) & set(nums2))
nums1 = [1,2,2,1]
nums2 = [2,2]
test = Solution()
print(test.intersection(nums1, nums2))
leetcode 202.快乐数
题目
202.快乐数
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。
解题思路
判断一个数是否为快乐数,1是快乐数,非1的都是非快乐数(非快乐数是一个集合)
如果数字n在非快乐数的集合中,返回False --要快速判断一个元素是否出现集合里的时候,就要考虑用哈希法。
1、遍历数字n的每一位:先把数字转换为字符串,再用for循环遍历
2、判断是否为快乐数:对数字n的每一位进行平方再求和,判断和是否为1,和为1则是快乐数,返回True
3、如果不是快乐数:数字n的每一位平方后和不是1,要对和再进行1、2操作
实现代码
class Solution:
def isHappy(self, n: int) -> bool:
record = set()
while n not in record:
record.add(n)
s = 0
for i in str(n): # 遍历出数字n的每一位
s += int(i) ** 2 # 对数字n的每一位进行平方后求和
print(s)
if s == 1: # 如果s值为1则为快乐数,返回True
return True
else: # 如果s值不是1,继续进行下一次操作,遍历数字s的每一位,对数字s的每一位进行平方再求和,判断是否为快乐数
n = s
return False
n = 19
test = Solution()
print(test.isHappy(n))
leetcode 1.两数之和
题目
1.两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
解题思路1
暴力法:两层for循环查找数组的值,外循环从下标0开始遍历值,内循环从下标1开始遍历值,两个值和为target,返回下标
实现代码
from typing import List
# 暴力法
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
# 暴力法
for i in range(0, len(nums)):
# for j in range(1, len(nums)): # Case是nums = [2,5,5,11], target = 10,结果返回的是[1, 1],结果错误
for j in range(i + 1, len(nums)): # i是慢指针,j是快指针,j的值是nums数组中i之外的值
if nums[j] == target - nums[i]:
return [i, j]
test = Solution()
print(test.twoSum(nums, target))
解题思路2
哈希法:
(1)判断target-nums[i]是否在nums中出现 --查找一个元素是否出现过,使用哈希法
(2)哈希法用那种数据结构 --set集合
(3)set集合的作用:存放遍历过的元素
实现代码
from typing import List
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
# 哈希法
s = set() # 存放已经遍历过的数组元素
for key, value in enumerate(nums): # enumerate函数遍历数组元素的下标和值
element = target - value
if element in s: # 判断element是否在遍历过的数组元素中,如果在则返回下标
return [nums.index(element), key]
s.add(value)
test = Solution()
print(test.twoSum(nums, target))