代码随想录算法训练营第六天 | 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

如果在做面试题目的时候遇到需要判断一个元素是否出现过的场景也应该第一时间想到哈希法!

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. 两个数组的交集

类型: #哈希表
难度: #简单
题目:给定两个数组 nums1nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序
思路:用 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{}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值