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

文章介绍了四道算法题目的解题思路和代码实现,包括验证字母异位词的有效性、找到两个数组的交集、判断快乐数以及解决两数之和的问题。解题方法主要利用哈希表和数组操作,如for-range循环、map的增删查等。

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

242.有效的字母异位词

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

思路

看了题解思路之后,学习了一下for…range语句的规则,其基本语法为:

for index,value := range array{
	...
}

其中,有几点注意如下:

  1. index和value为for循环内部可见的局部变量;
  2. array为待遍历的数组名字,index和value分别对应遍历数组的下标和值。

本题的思路主要是利用连续的小写英文字母组成的哈希表,在s序列中出现对应字母则数量加一,在t序列中出现则数量减一。判断该哈希表最后是否为空数组,如果空,则true,否则false。

解题代码

func isAnagram(s string, t string) bool {
    //1.定义新数组
    record := [26]int{}
    //2.使用for-range语句遍历数组
    for _,value := range s{
        record[value-rune('a')]++  //每个字母减去a对应的值为record的下标,我们要使其加1
    }
    for _,value := range t{
        record[value-rune('a')]--   //对应的,存在即减去
    }

    var ans bool     //更简单的写法 直接return record==[26]int{}
    if record == [26]int{} {
        ans = true
    }else{
        ans = false
    }
    return ans
}

349. 两个数组的交集

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

思路

涉及到的知识有:map的定义与分配内存、map的增删查、if _,ok语句的使用。

var newMap map[int]int   //定义: var map名 map[keyType]valueType
newMap = make(map[int]int,10)   //分配内存

//如果key在map里,value被赋值为map[Key],ok为true
if value,ok := map[key]; ok{
	//...
}

题解思路为:

  1. 用一个map,存放nums1里有的值;
  2. 一个res作为交集
  3. 遍历nums1,把值放进map里
  4. 遍历nums2,查验map里是否有对应的值,如果有,则把值放进res,在map里删去该值

解题代码

func intersection(nums1 []int, nums2 []int) []int {
    set:=make(map[int]struct{},0)  // 用map模拟set   定义一个map并分配内存
    res:=make([]int,0)  
    for _,v:=range nums1{   //遍历nums1
        if _,ok:=set[v];!ok{   //查找set里有没有值为v的,如果没有,则进入下面操作
            set[v]=struct{}{}  //用一个空结构体放v
        }
    }
    for _,v:=range nums2{  
        //如果存在于上一个数组中,则加入结果集,并清空该set值
        if _,ok:=set[v];ok{   //set里有没有值为v的,如果有,进入下面操作
            res=append(res,v)   //在res里放入这个值
            delete(set, v)     //在set里删去这个值
        }
    }
    return res
}

202. 快乐数

题目链接:202. 快乐数

思路

需要通过哈希的方法,给计算过的n增加一个标识,比如用true标记,这样如果循环到该n的时候,可以跳出,返回false

解题代码

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. 两数之和

题目链接:1. 两数之和

思路

这题关于map的用法,我还要再消化一下

解题代码

func twoSum(nums []int, target int) []int {
    m := make(map[int]int)
    for index, val := range nums {
        if preIndex, ok := m[target-val]; ok {   
            return []int{preIndex, index}
        } else {
            m[val] = index
        }
    }
    return []int{}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值