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

242.有效的字母异位词

文章讲解:https://programmercarl.com/%E5%93%88%E5%B8%8C%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html

思路: map遍历两遍么 第一次++ 第二次-- 最后判断map的总长度

func isAnagram(s string, t string) bool {
	mp1:=make(map[byte]int)

	for v := range s {
		t:=s[v]
		mp1[t]++
	}

	for v := range t {
		t:=t[v]
		mp1[t]--
		if mp1[t] ==0{
			delete(mp1,t)
		}
	}
	return len(mp1)==0

}

卡老师的方法 真简洁

func isAnagram(s string, t string) bool {
	record:= [26]int{}
	for _, v := range s {
		record[v-rune('a')]++
		
	}
	for _, v := range t {
		record[v-rune('a')]--
		
	}
	return record == [26]int{}

}

349.两个数组的交集

题目链接/文章讲解/视频讲解:https://programmercarl.com/0349.%E4%B8%A4%E4%B8%AA%E6%95%B0%E7%BB%84%E7%9A%84%E4%BA%A4%E9%9B%86.html

思路:直接一个map 值可以不设置

func intersection(nums1 []int, nums2 []int) []int {
	mp1:=make(map[int]struct{},0)
	result := make([]int, 0)
	for _, v := range nums1 {
		if _,ok:=mp1[v];!ok{//去重如果有多个这个只取一个
			mp1[v]=struct{}{}
		}
		
	}
	for _, v := range nums2 {
		if _,ok:=mp1[v];ok{//去重
			result=append(result,v)	
			delete(mp1,v)		
		}
	}
	return result
	
}

202.快乐数

题目链接/文章讲解:https://programmercarl.com/0202.%E5%BF%AB%E4%B9%90%E6%95%B0.html

思路:!m[n]判断不循环 如果出现相同的数就代表循环了

func isHappy(n int) bool {
	m:=make(map[int]bool, 0)
	for n!=1&&!m[n] {// !m[n]判断不循环 如果出现相同的数就代表循环了
		n,m[n]=getSum(n),true
		
	}
	return n == 1
}

func getSum(i int)int{
	sum:=0
	for i>0{
		sum += (i%10)*(i%10)
		i!=10
	}
	return sum

}

4.两数之和

题目链接/文章讲解/视频讲解:https://programmercarl.com/0001.%E4%B8%A4%E6%95%B0%E4%B9%8B%E5%92%8C.html

// 思路 一遍遍历就行了不需要两次, target-v = key 找到key的存在那就说明有两数和

func twoSum(nums []int, target int) []int {
	mp1:=make(map[int]int)
	for idx1, v := range nums {
		key:=target-v
		if  idx2,ok:=mp1[key];ok {
			return []int{idx1,idx2}
		}else {
			mp1[v]=idx1
		}
	}	
	return []int{0,0}
}

//暴力解法

func twoSum(nums []int, target int) []int {
	for k1, _:= range nums {
		for k2 := k1+1; k2 < len(nums); k2++ {
			if nums[k1]+nums[k2]==target{
			return []int{k1,k2}
			}	
		}
	}
	return []int{}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值