leetcode 349
链接:349. 两个数组的交集 - 力扣(LeetCode)
思路:
方法1 直接用交集运算符
return list(set(nums1) & set(nums2))
方法2 hash
先对两个数组分别进行去重操作
然后创建两个hash集合,第一个集合储存nums1的元素,然后第二个进行对比
如果第二个数组中的元素在res1中出现过,那么就放到结果数组中去,最后转换为数组返回
代码:
#方法1 直接用交集运算符
# return list(set(nums1) & set(nums2))
#方法2
nums1 = set(nums1)
nums2 = set(nums2)
result = set()
result1 = set()
for i in nums1:
result1.add(i)
for j in nums2:
if j in result1:
result.add(j)
return list(result)
Leetcode242有效的字母异位词
链接:242. 有效的字母异位词 - 力扣(LeetCode)
思路:根据题意来看,出现的次数相同,也即意味着s&t都是同样的字母组成,所以首先我们用一个ord函数获取到当前字母的ACCSII码,然后向后获取s里面每个字符的accsii,这里减去a的意思说获取一个相对位置也就是当前字母离a的差值,然后每次加1算出当前出现的次数,例如从第一个数字开始是ord(a)-ord(a)这是等于0,然后+=1,即代表着在第0个索引出现了1此,
如下图所示:
(上图来自于代码随想录录友提供,公众号:代码随想录)
举个例子,s='abbc',t = 'bbca'这里两个字符的开头一个是a一个是b,但是当他们经过ord()函数转换之后再减去‘a',都会匹配到他们在字符中对应的索引位置。
这个是我当时提出的问题:字母异位词我有一个问题,当我们创建一个26大小的数组,然后遍及第一个数组得到他们对应的哈希值存起来,然后再遍及第二个数组用他们的哈希值和第一个数组的相减,假如说是abbc和bbac。这里第一个数组存了abbc的哈希值,然后第二个数组是bbac的。但是这里数组开头的分别是a和b 那他们的哈希值相减怎么会等于0呢?
答案就是我上面说的 他们经过转换会找到自己对应的位置。
代码:
def isAnagram(self, s: str, t: str) -> bool:
result = [0]*26
for i in range(len(s)):
result[ord(s[i])-ord('a')]+=1
for j in range(len(t)):
result[ord(t[j])-ord('a')]-=1
for x in result:
if x!=0:
return False
return True
这里有一个地方需要注意哈:
for x in result:
if x!=0:
return False
return True
我最开始写的是return fasle if x!=0 else true
这里最根本的区别就是 我们的循环退出,如果用我一开始写的,循环到一半发现有不等于0的就直接返回fasle,后面的就不用管了。这样子看起来确实是没问题。
但是需要知道的是,false是可以循环中间判断出结果,但是true,我们必须要保证是遍历完所有字母都没问题才可以返回!!!!!
并且!这里如果用我一开始的这种写法,相当于if else只会判断第一个元素 然后返回了一个true直接退出循环!相当于只判断了第一个元素,ifelse只执行了一次!!!不会判断后面的元素了!
我真的要笨死了!居然是这个原因。。。。。
第一次做这种题,完全没有经验哈哈哈
Leetcode202快乐数
思路:
题目中说到,如果这个数字会导致无限重复,那么就可能是死循环,这是一个很重要的点,也是
判断的根本条件,也就是说 当我们发现拆分下去之后数字的平方和加起来和之前的某一次相等
那么就可以判断他不是一个快乐数可以直接返回false
所以我们创建一个结果集合来负责记录元素,当然这里用数组也可以哈!如果说当前数字在结果集合中已经出现过,那么就直接返回fasle了。
代码:
class Solution:
def isHappy(self, n: int) -> bool:
def calculate(num):
sum_ = 0
# 从个位开始依次取,平方求和
while num:
sum_ += (num % 10) ** 2
num = num // 10
return sum_
# 记录中间结果
record = set()
while True:
n = calculate(n)
if n == 1:
return True
# 如果中间结果重复出现,说明陷入死循环了,该数不是快乐数
if n in record:
return False
else:
record.add(n)
Leetcode01 两数之和
思路:
使用hashmap对于每一个出现的数字检查,这里是两个数相加有一个目标值,那我们反过来做减法
如果说目标值减去当前的值的,他们的差值这个数字已经出现在hashmap里面,
那是不是可以直接返回他们的下标了
这里注意一个点,hashmap = {},是一个字典,如果说第一个数字2不在map中,那么
hashmap[2] = 0 这里不是指index第二个等于0哦,他的意思是说hashmap={2:0},是直接添加的!!
把2当作键,把0当作值,因为我们最终要取得是他们的下标,但是字典只能通过键访问值。
所以这里需要反过来写,不是写成hashmap[0]=2了哦,我第一次就是犯了这个错误 改了很久!!!!
代码:
def twoSum(self, nums: List[int], target: int) -> List[int]:
hashmap = {}
for key,value in enumerate(nums):
another_value = target - value
if another_value in hashmap:
return [hashmap[another_value],key]
else:
hashmap[value] = key
return None
总结:写博客记录真的有好处 帮助自己再理清一遍思路
字母异位类型的题第一次做,对于需要用到ord函数不是很熟悉,用到accsii这种比较陌生
两数之和是我载过n遍的题目了,今天是n+1。相信今天过后不会再栽跟头了!!!
hash很好用,这几道题基本都是第一次用这种思路 以后要加强看题的思维方式。如果加法不成那就做减法hhhhh