如果在做面试题目的时候遇到需要判断一个元素是否出现过的场景也应该第一时间想到哈希法!
242. 有效的字母异位词
类型: #哈希表
难度: #简单
题目:给定两个字符串 _s_
和 _t_
,编写一个函数来判断 _t_
是否是 _s_
的字母异位词。
注意:若 _s_
和 _t_
中每个字符出现的次数都相同,则称 _s_
和 _t_
互为字母异位词。
思路:哈希表,用一个 26 大小的数组,遍历 s 将出现的字母对应下标的值 ++,再遍历一遍 t 把出现的字母 --。但要注意给的是字符串,需要 -rune('a')
,变成从 小写字母 a~z 对应 0~25
备注:rune
是 Go 语言中的一种数据类型,表示 Unicode 编码的一个字符。rune('a')
可以将字符 a
转换为对应的 Unicode 编码,因此 r-rune('a')
的结果就是字符 r
在字母表中的位置(从 0 开始计数)
实现:
func isAnagram(s string, t string) bool {
record := [26]int{}
for _, r := range s{
record[r - rune('a')]++
}
for _, r := range t{
record[r - rune('a')]--
}
return record == [26]int{}
}
349. 两个数组的交集
类型: #哈希表
难度: #简单
题目:给定两个数组 nums1
和 nums2
,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
思路:用 map 初始化 set,键 int 值 为空结构体,遍历 nums1 取值,如果这个值在 set 键中没出现过,则在 set 中加入这个键,值不重要直接空结构体就好;再遍历 nums2,如果 v 在 set 中有的话,将 v 加入 result,并从 set 中删除
实现:
func intersection(nums1 []int, nums2 []int) []int {
set := make(map[int]struct{}, 0)
result := make([]int, 0)
for _, v := range nums1{
if _, ok := set[v]; !ok{
set[v] = struct{}{}// struct{} 的实例
}
}
for _, v := range nums2{
if _, ok := set[v]; ok{
result = append(result, v)
delete(set, v)
}
}
return result
}
202. 快乐数
类型 #哈希表
难度: #简单
题目:编写一个算法来判断一个数 n
是不是快乐数。
「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
思路:主要是判断在 n 计算平方和的过程中有没有出现重复的 sum,如果有则不可能和为 1。先写 getSum() 处理整数平方和逻辑,然后回到主函数,定义一个 map,先将 n = 1 的情况剪枝,然后当 m 中没有出现 n 时进行循环,调用 getSum(n) 处理 n,同时将 map 中对应的 bool 置为 true。
实现:
func isHappy(n int) bool {
m := make(map[int]bool)
for n != 1 && !m[n]{
n, m[n] = getSum(n), true
}
return n == 1
}
func getSum(n int) int{
sum := 0
for n > 0{
sum += (n%10) * (n%10)
n = n/10
}
return sum
}
1. 两数之和
类型: #哈希表
难度: #简单
题目:给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
思路:创建 map,key 放数组元素,value 放数组元素下标;遍历数组,去 map 找是否有 key 为 diff 的键值对,如果有,value 和此时遍历的数组下标就是要返回数组
实现:
func twoSum(nums []int, target int) []int {
m := make(map[int]int)
for index, v := range nums{
diff := target - v
if preIndex, ok := m[diff]; ok{
return []int{preIndex, index}
}else{
m[v] = index
}
}
return []int{}
}