排序刷题2(Go)
两个数组的交集
题目描述
给定两个数组,编写一个函数来计算它们的交集。
示例1:
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2]
示例2:
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [9,4]
说明:
- 输出结果中的每个元素一定是唯一的。
- 我们可以不考虑输出结果的顺序。
解题思路
- 遍历其中一个数组,找到在另外一个数组有相同值的数,添加到新建的切片中。
- 去除重复值。
- 这里可以运用map来转换,把数组一当键值;用数组二去查找,有相应键值,则标记;最后统计map中有标记的键值存入新建的切片中返回。
代码
func intersection(nums1 []int, nums2 []int) []int {
r := []int{}
m := make(map[int]int,len(nums1))
for _,v := range nums1 {
m[v] = 0
}
for _,v := range nums2 {
if _,ok := m[v];ok {
m[v] = 1
}
}
for i := range m {
if m[i] != 0 {
r = append(r,i)
}
}
return r
}
有效的字母异位词
题目描述
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 示例1:
输入: s = "anagram", t = "nagaram"
输出: true
示例2:
输入: s = "rat", t = "car"
输出: false
说明: 你可以假设字符串只包含小写字母。
解题思路
一开始我想到和上面一题的差不多,用map解决。先把第一个字符串当作键值,并记录其个数。 然后再遍历第二个字符串,查找并减少对应的个数。 最后遍历map,有不为零的则不是有效的字母异位词,否则是有效的字母异位词。但是效率不高。
代码
我的代码:
func isAnagram(s string, t string) bool {
s1 := []byte(s)
t1 := []byte(t)
m := make(map[byte]int)
for _,v := range s1 {
m[v]++
}
for _,v := range t1 {
if _,ok := m[v];ok {
m[v]--
} else {
return false
}
}
for _,v := range m {
if v != 0 {
return false
}
}
return true
}
大神的代码:
func isAnagram(s string, t string) bool {
ls := len(s)
lt := len(t)
if ls != lt {
return false
}
a := make([]int, 26)
for i:=0;i<ls;i++ {
a[(s[i] - 'a')]++
a[(t[i] - 'a')]--
}
for _, v := range a {
if v != 0 {
return false
}
}
return true
}