文档参考:programmercarl.com
242.有效的字母异位词
这个题吧,一看就知道肯定可以用暴力法来做,代码也很简单
class Solution(object):
def isAnagram(self, s, t):
for i in range(97, 123): # 小写字母的ASCLL码值为97-123
if self.num(s, chr(i)) != self.num(t, chr(i)): # 判断两个字符串中的字母数量是否相同
return False
return True
def num(self, string, tar): # 计算字符串中的字母的数量
sum = 0 # 数量
for i in range(len(string)):
if string[i] == tar:
sum += 1
return sum
但是既然是学算法,那么肯定要追求更快的速度,所以这道题就用到了我今天刚学的哈希表,将每个小写字母按顺序映射成数组的索引,使该数组成为一张哈希表;然后就可以利用该哈希表记录其中一个字符串的每个小写字母的值,然后再与另一个字符串作比较;
其中哈希表(数组)的索引0 ~ 25正好对应a ~ z;
# 现在就是哈希表法
# 对于有一定规律的数据,可以用数组的索引来记录真实的数据,然后数组的值对应数据的数量
class Solution_1(object):
def isAnagram(self, s, t):
record = [0] * 26
for i in s: # 统计s字符串的每个值的数量
record[ord(i) - ord("a")] += 1
for i in t: # 统计t字符串的每个值的数量
record[ord(i) - ord("a")] -= 1
for i in range(26):
if record[i] != 0:
return False
return True
349.两个数组的交集
这道题让我们求两个数组之间的交集,然后交集中不能有重复的值;要求快速在数组中找出需要的值,还要保证不重复,所以这里采用的是集合方式编写代码;
首先将一个数组中的所有值以[key, value]的形式记录到哈希表中,因为哈希表讲究唯一的映射值,所以key也只能有一个,然后判断第二个数组中的值是否在该哈希表中,如果在该表中能够找到匹配项,说明这个数是两个数组的交集,就将它添加到集合当中,同时删除哈希表中对应的值,防止下次继续添加
"""
哈希表在python中的体现就是字典
利用字典的键存储重复出现的数据,字典的值记录出现的次数
"""
class Solution(object):
def intersection(self, nums1, nums2):
# 先利用哈希表存储一个数组中的所有元素
table = {}
for num in nums1:
table[num] = table.get(num, 0) + 1
# get方法用于在字典中查找键值,如果没有查到就输出默认值0
# 然后使用集合存储结果
res = set()
for i in nums2:
if table.get(i) != None:
res.add(i)
# 为了保证独立性,需要删除之前已经添加进集合中的键值
del table[i]
return list(res)
202.快乐数
这道题,我看题目是没想出思路来,感觉很像数学题,因为能够无限循环下去,所以当第二次出现相同值的时候,说明正在循环没有结果,所以只需要用哈希表记录每次相加的和就行,然后不断匹配即可
class Solution(object):
def isHappy(self, n):
# 由于结果为1的情况就是集合中只有0和1存在
res = set() # 创建一个集合用来存储所有的结果
sum = 0
while True:
for i in str(n):
sum += int(i) ** 2 # 计算总和
if sum == 1: # 当总和为1时返回True
return True
if sum in res: # 当总和再一次重复时,说明不是快乐数
return False
else:
res.add(sum) # 将数据添加到集合中,继续下次计算
n = sum
sum = 0
1.两数之和
作为leetcode上的第一题,为表敬意,先暴力下先,两个for循环,很简单
"""
遇事不决先暴力
"""
class Solution(object):
def twoSum(self, nums, target):
for i in range(len(nums) - 1):
for j in range(i + 1, len(nums)):
if nums[i] + nums[j] == target:
return [i, j]
return None
但是学了算法,就还得用算法来解决嘛,这里用到的是map方法,利用[key, value]来记录[数值,数组索引],这题和349有点像,关键在于利用key可以被快速检索的性质,一般的数组是我们可以通过索引来快速查找对应下标的数据,这里的话就反过来,因为我们需要快速查找需要的数据,利用真实数据来查是手段,找对应下标是结果,所以这个哈希表对于数组相当于反过来,用key保存数据,用value保存下标,然后我们利用key(相当于数组的索引)来快速搜索,搜到之后再吐出value(相当于数组保存的值)
# map方法
# 利用map存储键值对,以key,value的形式保存所谓的值
class Solution_1(object):
def twoSum(self, nums, target):
record = dict() # 字典(哈希表)
for index, value in enumerate(nums): # 记录数组的键值对
if target - value in records: # 利用减法反求需要的数
return [record[target - value], index] # tar - val是实际的值,record[tar - val]就是指索引
record[value] = index # 将索引添加到哈希表中
return []
还行,感觉哈希表吧,还是有点抽象(摊手)