242.有效的字母异位词
巧妙点:定义一个26个元素的数组,0-25对应a-z在字符串1中出现的次数,而后字符串2中出现的字母做减法操作,最终数组每个元素都为0,则返回True。
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
record=[0]*26
for i in s:
record[ord(i)-ord('a')]+=1(两者的ASCII码相减)数组也是一种哈希
#并不需要记住字符a的ASCII,只要求出一个相对数值就可以了
for i in t:
record[ord(i)-ord('a')]-=1
for i in range(26):
if record[i]!=0:
return False
return True
349. 两个数组的交集
初始想法:利用集合来存储两个数组,然后找两个集合的交集(集合本身就是去重的)
巧妙点:将数组1放到哈希表集合里,便利数组2,看元素是否在集合里,有就存储到result(unorder set)里面(学会用集合)
2:由于数据小于1000,用数组也行,利用数组下标来做哈希运算
定义空字典 dict={},定义空集合 set()
字典的常用方法需要熟悉
第202题. 快乐数
题解:
题目中说了会 无限循环,那么也就是说求和的过程中,sum会重复出现,这对解题很重要!
正如:关于哈希表,你该了解这些! (opens new window)中所说,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法了
一个正整数如何变成各个数值?
1、如19变成1和9,用str(n),在int
n_str = str(n)
for i in n_str:
new_num+=int(i)**2
2、用divmod函数
n,r=divmod(n,10)
new_sum+=r**2
循环的过程可以定义get_sum函数
1. 两数之和
初步想法:暴力循环,哈希表用于检查元素是否在某个集合中,不知该如何运用?
题解:利用map结构,key用来存元素值,value 放下标,key的查询速度快些
学会用enumerate 函数
排序后可以用双指针方法做
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
nums_sorted=sorted(nums)
left=0
right=len(nums_sorted)-1
while left<right:
sum=nums_sorted[left]+nums_sorted[right]
if sum==target:
return[left,right](错误,返回的是num_sorted数组的下标
elif sum>target:
right-=1
else :
left+=1
return[]
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
nums_sorted=sorted(nums)
left=0
right=len(nums_sorted)-1
while left<right:
sum=nums_sorted[left]+nums_sorted[right]
if sum==target:
left_index=nums.index(nums_sorted[left])(学会数组index的用法)
right_index=nums.index(nums_sorted[right])
if left_index==right_index:
right_index = nums[left_index+1:].index(nums_sorted[right]) + left_index + 1(不加这句话,测试【3,3】6时出错,正确的返回【0,0】错误的返回【0,1】)
解答:从left_index+1向后进行数组切片,然后对切片后的数组寻找nums_sorted[right]的索引,最后加上left_index + 1,因为是从left_index + 1开始切片的
return[left_index,right_index]
elif sum>target:
right-=1
else :
left+=1
return[]