比较简单,用一个map即可,key是数,value存下标
注意这里用m[target-val] !=-1 !=0都不合适
value, ok := m[key]这样比较好
func twoSum(nums []int, target int) []int {
    
    m := map[int]int{}
    for i, val := range nums {
        
        if _, ok := m[target-val]; ok {
            fmt.Println(i, m[target-val])
            return []int{i, m[target-val]}
        }
        m[val] = i
        // if m[target-val] != -1{ // !=0
            
        // }
    }
    return []int{-1,-1}
}
用一个map记单词出现的次数做为key。map的设计是关键,key是一个26大小的数组,记录每个字母出现的次数, value用一个string切片,存对应的单词
func groupAnagrams(strs []string) [][]string {
    res := make([][]string, 0)
    m := map[[26]int][]string{}  //key - [26]int, value - []string
    for _, str := range strs {
        count := [26]int{}
        
        for _, c := range str {
            count[c-'a']++
        }
        m[count] = append(m[count], str)
    }
    for _, value := range m {
        res = append(res, value)
    }
    return res
}
两个单词经过排序一定一样,基于这个做 —>把排序完的字符串作为map的key即可
注意go对字符串的排序操作,转成byte切片,再根据对切片的排序进行操作
func groupAnagrams(strs []string) [][]string {
    m := map[string][]string{}
    for _, str := range strs {
        s := []byte(str)
        sort.Slice(s, func(i, j int) bool {
            return s[i] < s[j]
        })
        sstr := string(s)
        m[sstr] = append(m[sstr], str)
    }
    res := make([][]string, 0, len(m))	//开结果切片的时候可以根据map的长度给一个初始的cap
    for _, value := range m {
        res = append(res, value)
    }
    return res
    
}