代码随想录算法训练营第六天 | 242.有效的字母异位词 ,349. 两个数组的交集 , 202. 快乐数 ,1. 两数之和
LeetCode 242-有效的字母异位词
题目:
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1: 输入: s = “anagram”, t = “nagaram” 输出: true
示例 2: 输入: s = “rat”, t = “car” 输出: false
题目链接:
242-有效的字母异位词
思路:
可以设置一个26位的数组,因为字符a到z的ASCII码为连续的数值, 数组的下标可以为当前字母的ASCII码值减去字母"a"的ASCII码。若字符串s中,每个字母出现一次则加1,在字符串t中,每个字母出现一次则减1。只要最终数组不为0,就不是有效的字母异味词。
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
record = [0] * 26
for i in s:
record[ord(i) - ord("a")] += 1
for i in t:
record[ord(i) - ord("a")] -= 1
for i in range(26):
if record[i] != 0:
return False
return True
LeetCode 349-两个数组的交集
题目:
题目链接:349-两个数组的交集
思路:
使用字典储存nums1数组出现过的数字,在遍历nums2数组,若当前数字在字典中,且之前没有出现过的就用ans数组储存该数字。
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
val_dict = {} #以字典的形式储存
ans = []
for num in nums1:
val_dict[num] = 1
for num in nums2:
if num in val_dict.keys() and val_dict[num] == 1:
ans.append(num)
val_dict[num] = 0 #防止重复出现的数字被重复加到结果里面
return ans
拓展:
LeetCode 350-两个数组的交集 II
题目:
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
思路:
与上题的不同之处在于,这次要求每个元素出现的次数(取出现次数的最小值),因此元素的每次出现都要记录下来。
class Solution:
def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
val_dict = {}
ans = []
for num in nums1:
if num not in val_dict.keys():
val_dict[num] = 1
else: #记录数组nums1重复出现的数字个数
val_dict[num] += 1
for num in nums2:
if num in val_dict.keys() and val_dict[num] >= 1:
ans.append(num)
val_dict[num] -= 1
return ans
LeetCode 202-快乐数
题目:
题目链接:
202-快乐数
思路:
设置好本题的循环终止条件比较关键。使用set()函数的特点是不可添加重复的元素,我们可以把出现过的数字和用set()函数储存起来,如果该数字和已经出现过了,就终止循环。
此外,由于我们不太清楚数字和的数字位数,因此我们需要从个位数开始实现平方数的逐位相加。
class Solution:
def isHappy(self, n: int) -> bool:
def happySum(n):
sum = 0
while n: #从个位开始平方后相加
sum += (n % 10) ** 2
n = n // 10
return sum
record = set()
while True:
n = happySum(n)
if n == 1:
return True
if n in record: #若再次出现已经出现过的数字平方和,则判断为循环,返回false
return False
else:
record.add(n)
LeetCode 1-两数之和
题目:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
题目链接:
1-两数之和
思路:
使用enumerate(sequence, [start=0])函数。先把出现过的元素储存起来, 然后将目标值减去当前数,在查看字典中是否有相同的数字。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
records = dict()
#使用enumerate(sequence, [start=0])函数
for index, value in enumerate(nums):
if target - value in records:
return [records[target - value], index]
records[value] = index #在没找到符合条件要求相加的整数时,先把该数字添加进字典里面,且该数字所在数组的下标为key
return []
总结:
感觉自己懂了又好像没懂。就是python写起来感觉要简单很多。