题目链接:有效的字母异位词、两个数组的交集、快乐数、两数之和
有效的字母异位词
时间复杂度: 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
}
两个数组的交集
思路:
- 遍历nums1, 用map将nums1中的数字进行存储
- 遍历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{}
}