排序刷题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
}