Day5 Golang (哈希表)242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

// 242.有效的字母异位词
package main

import "fmt"

func isAnagram(s string, t string) bool {
	hash := [26]int{}     //初始化数组,元素为全0
	for _, v := range s { //字符串的遍历,v为rune类型
		hash[v-rune('a')]++ //rune('a') 'a'为uint8类型(ASCII码),需要转换为rune类型
	}
	for _, v := range t {
		hash[v-rune('a')]--
	}
	for _, v := range hash { //方法1:判断hash数组是否全为0
		if v != 0 {
			return false
		}
	}
	return true
	// if hash == [26]int{} { //方法2:判断hash数组是否为全0
	// 	return true
	// } else {
	// 	return false
	// }
}

func main() {
	s := "anagram"
	t := "nagaram"
	b := isAnagram(s, t)
	fmt.Printf("b: %v\n", b)//b:true
}
// 349. 两个数组的交集
package main

import "fmt"

func intersection(nums1 []int, nums2 []int) []int {
	set := make(map[int]int, 0) // 用map模拟set,注意初始化map的方法
	res := make([]int, 0)
	for _, k := range nums1 { //注意if _, ok := set[v]有两个返回值,如果v对应有值,返回该值,ok=true;否则返回0,ok=false
		if _, ok := set[k]; !ok { //!ok相当于只统计1次作对nums1去重
			set[k]++
		}
	}
	for _, k := range nums2 {
		//如果存在于上一个数组中,则加入结果集,并使计数减1,即去重
		if set[k] > 0 {
			res = append(res, k)
			set[k]-- //相当于只统计1次作对nums2去重
		}
	}
	return res
}
func main() {
	s1 := []int{3, 2, 3, 7, 5}
	s2 := []int{6, 2, 2, 4, 5}
	fmt.Printf("intersection(s1, s2): %v\n", intersection(s1, s2))//intersection(2, 5)
}

//208.快乐数
package main

import "fmt"

func isHappy(n int) bool {
	hash := make(map[int]bool)
	for n != 1 && !hash[n] { //注意这里用for hash[n]为true说明元素出现过,对应!hash[n]为false 即发生了循环
		n, hash[n] = getSum(n), true //19:true 建立hash映射
	}
	return n == 1

}
func getSum(n int) int { //求各位置元素的平方和
	sum := 0
	for n > 0 {
		sum += (n % 10) * (n % 10)
		n = n / 10
	}
	return sum
}

func main() {
	n := 19
	res := isHappy(n)
	fmt.Printf("res: %v\n", res) //res: true
}
//1. 两数之和
package main

import "fmt"

func twoSum(nums []int, target int) []int {
	set := make(map[int]int, 0)
	res := make([]int, 0)
	for i, v := range nums {
		s := target - v            //s为目标元素
		if val, ok := set[s]; ok { //如果目标元素s被map遍历过,取出两个下标放入结果集
			res = append(res, val)
			res = append(res, i)
		} else { //如果目标元素s未被遍历过,将现在正在遍历到的元素v和v的下标存入map中
			set[v] = i
		}
	}
	return res
}
func main() {
	nums := []int{3, 2, 4}
	res := twoSum(nums, 6)
	fmt.Printf("res: %v\n", res) //res: [1 2]
}

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值