[代码随想录]Day05-哈希表 part01

发布时间 2023-07-31 21:10:17作者: WtcSky

题目:242. 有效的字母异位词

思路:

很简单,就是看两个字符串每个字母出现的次数是不是相同的。

可以用两个数组来比较,也可以用一个数组比较。

代码:

一个数组

func isAnagram(s string, t string) bool {
    isExist := [26]int{} // 26个字母
    for _, ch := range s {
       isExist[ch-'a']++  // 存一遍每个字母出现的次数
    }
    for _, ch := range t {
        isExist[ch-'a']-- // 出现就-1
    }
    for i := 0; i < 26; i++ { // 如果s和t是异位词那么26个位置都是0
        if isExist[i] != 0 {
            return false
        }
    }
    return true
}

参考:

代码随想录

题目:349. 两个数组的交集

思路:

和上面题思路大致一样,都是一个先跑一遍记录,另一个再跑一遍找结果。

值得注意的一点是结果不能有重复,这样的话通过delete删除map的节点来实现不会有重复的数据,这是这个题目学到的最重要的一点了。

代码:

func intersection(nums1 []int, nums2 []int) []int {
    res := []int{}
    maps := make(map[int]bool, 0)
    for _, k := range nums1 { // 存一遍
        maps[k] = true
    } 
    for _, k := range nums2 { 
        if _, ok := maps[k] ; ok { // 都有
            res = append(res, k) // 添加到答案
            delete(maps, k)  // 删除map的key-value
        }
    }
    return res
}

参考:

代码随想录

题目:202. 快乐数

思路:

关键一个点,如果出现不了1就会出现循环,也就是相同的数会第二次出现,那么如果出现了两次相同的数据就直接false。

之后就是不断计算就好了。

代码:

func isHappy(n int) bool {
    isExist := make(map[int]bool, 0)
    for {
        if n == 1 { 
            return true
        }
        if _, ok := isExist[n]; ok { // 如果开始循环了就退出
            break
        }
        isExist[n] = true // 标记已经出现过了
        n = calc(n) // 数据处理
    }
    return false
}

func calc(x int) (res int) { // 进行数据处理的函数
    for x != 0 {
        tmp := x % 10
        res += tmp * tmp
        x /= 10
    }
    return
}

参考:

代码随想录

题目:1. 两数之和

思路:

假设a + b = target,target我们知道了,那如果我们知道了a,那b = target - a;也就是说当我们遍历到了a(已知a),就可以通过target - a去查询是否出现了b,如果b已经存在了,那么就返回结果[]int{a,b}即可。

代码:

func twoSum(nums []int, target int) []int {
    isExist := make(map[int]int, 0) 
    for i := 0; i < len(nums); i++ {
        if v, ok := isExist[target-nums[i]]; ok { // 判断是否出现了
            return []int{v,i}
        }
        isExist[nums[i]] = i
    }
    return []int{}
}

参考:

代码随想录