day05休息,day06 有效的字母异位词、两个数组的交集、快乐数、两数之和

本文介绍了四个编程问题:Go语言实现的有效字母异位词检查(O(n)时间复杂度,O(26)空间复杂度)、两个数组交集查找(O(m+n)时间复杂度,O(n)空间复杂度)、快乐数判断避免无限循环以及两数之和的快速查找(O(n)时间复杂度)。
摘要由CSDN通过智能技术生成

题目链接:有效的字母异位词两个数组的交集快乐数两数之和

有效的字母异位词

时间复杂度: O(n)
空间复杂度: O(S), S为字符集大小,这里为26

Go

func isAnagram(s string, t string) bool {
	// s和t的长度一定是相等的
	if len(s) != len(t) {
		return false
	}

	// 共有26个字符
	chars := [26]int{}

	for _, ch := range s {
		chars[ch-'a']++
	}

	for _, ch := range t {
		if chars[ch-'a'] == 0 {
			return false
		}
		chars[ch-'a']--
	}
	return true
}

两个数组的交集

思路:

  1. 遍历nums1, 用map将nums1中的数字进行存储
  2. 遍历nums2,查询map中数字是否存在 如果count存在,就将数字加入到结果数组,并将key从map中删除

Go

时间复杂度: O(m+n)
空间复杂度: O(n)

func intersection(nums1 []int, nums2 []int) []int {
	nums1Map := map[int]struct{}{}

	result := []int{}

	// 记录nums1
	for _, v := range nums1 {
		if _, ok := nums1Map[v]; !ok {
			nums1Map[v] = struct{}{}
		}
	}

	// 遍历nums2,寻找交集
	for _, v := range nums2 {
		if _, ok := nums1Map[v]; ok {
			result = append(result, v)
			delete(nums1Map, v)
		}
	}

	return result
}

快乐数

注意项:计算过程中可能会无限循环,而始终得不到1, 即计算过程中的sum可能会重复,如果sum重复说明遇到了无限循环

go

func isHappy(n int) bool {
	// 用来收集sum
	m := map[int]bool{}

	for n != 1 && !m[n] {
		m[n] = true
		n = getSum(n)
	}

	return n == 1
}

func getSum(n int) int {
	sum := 0
	for n != 0 {
		// 获取个位数
		temp := n % 10
		sum += temp * temp

		// 移除掉个位
		n /= 10
	}

	return sum
}

两数之和

思路:value作为map的key,value的index作为map的value
时间复杂度: O(n)
空间复杂度: O(n)

Go

func twoSum(nums []int, target int) []int {
	m := make(map[int]int)

	for idx, v := range nums {
		if otherIdx, ok := m[target-v]; ok {
			return []int{otherIdx, idx}
		} else {
			m[v] = idx
		}
	}

	return []int{}
}

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值