代码随想录算法训练营第六天 | LeetCode242.有效的字母异位词、LeetCode349. 两个数组的交集、LeetCode202. 快乐数、LeetCode1. 两数之和
前言
今天开始哈希表部分,以下默认各位了解哈希表。不了解的朋友请百度一下。
242.有效的字母异位词
题目链接
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1: 输入: s = “anagram”, t = “nagaram” 输出: true
示例 2: 输入: s = “rat”, t = “car” 输出: false
说明: 你可以假设字符串只包含小写字母。
(简单来讲,就是判断s和t是否具有相同的字母,仅仅是位置不同)
思路:
一串字符,最多包含26种字母。故创建数组record存放26个字母的个数。(意味着数组长度为26)
1、遍历s,每检测到一个字母,在record对应处+1。
2、再遍历t,每检测到一个字母,在record对应处-1。
最后对比,若 record 中全为0,返回 True ;否则,返回 False。
代码如下:
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
record = [0]*26
for i in range(len(s)):
record[ord(s[i])-ord('a')] += 1
for i in range(len(t)):
record[ord(t[i])-ord('a')] -= 1
for i in range(26):
if record[i] != 0:
return False
return True
349. 两个数组的交集
题目链接
题意:给定两个数组,编写一个函数来计算它们的交集。
说明: 输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。
思路:
与上面的242相同,创建空数组count,遍历num数组,如果数组中包含某个数,就将这个count[数]+1
最后,遍历count数组,count1[i] * count2 [i] !=0:则表示这个数子需要输出
代码如下:
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
count1 = [0] *1001
count2 = [0] *1001
result = []
for i in range(len(nums1)):
count1[nums1[i]] += 1
for i in range(len(nums2)):
count2[nums2[i]] += 1
for i in range(1001):
if count1[i]*count2[i] != 0:
result.append(i)
return result
202. 快乐数
题目链接
「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。
如果 n 是快乐数就返回 True ;不是,则返回 False 。
示例:
输入:19
输出:true
解释:
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1
思路
重复的将数字的各位平方求和,直到sum为1,或者无限循环。
很明显此处的重复执行应该是while循环,那么while 命题很重要。
无限循环,那么也就是说求和的过程中,sum会重复出现,因此用record数组记录所有出现的sum,一旦重复return false。
所以循环命题为: while sum不在record中:
代码如下:
class Solution:
def isHappy(self, n: int) -> bool:
record = []
while n not in record:
record.append(n)
sum = 0
for a in str(n):
sum += int(a)**2
if sum == 1:
return True
else:
n = sum
return False
1. 两数之和
题目链接
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
思路:
啊,暴力好用,真的
两层for 循环,快速解决
代码如下:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
record = []
for i in range(0,len(nums)):
for j in range(i+1,len(nums)):
if nums[i] + nums[j] == target:
record.append(i)
record.append(j)
return record
更高级的方法,下次用吧
总结
-
待改进: 对于这一块说的set没有弄明白,集合和字典基本忘光了。
-
收获: 242的思路很棒,值得学习