Golang HOT100 做题记录
1. 两数之和
题目大意:给出一个数字的数 []num,一个目标值 target。在数组中,找出两数之和为目标值的下标,任意输出一个答案。
例子:num[] = {0, 2,3, 4, 2}, target = 4, 输出:[]int{0,3}
注意点:1. 不能重复,如上不能为 []int{1,1} ,2.注意数组中重复数字处理
首次代码:
mp记录一下 value, target-value 对应的 index
repeat 记录首次出现的index,mp则是第二次出现的 index
(我怎么可以写的这么复杂?)
func twoSum(nums []int, target int) []int { mp := make(map[int]int, 0) repeat := make(map[int]int, 0) for k, v := range nums { if _, ok := mp[v]; ok { repeat[v] = mp[v] } mp[v] = k } for _, v := range nums { k1, ok1 := mp[v] k2, ok2 := mp[target-v] k3, ok3 := repeat[v] if ok1 && ok2 && (k1 != k2 || ok3) { if (ok3) { return []int{k1, k3} } return []int{k1, k2} } } return []int{} }
标准代码:
func twoSum(nums []int, target int) []int { hashTable := make(map[int]int, 0) for k, v := range nums { // 加个简单的判断 当前v是否与之前出现过的匹配,如果匹配,返回,不匹配,记录到hashmap中 if v2, ok := hashTable[target-v]; ok { return []int{k, v2} } hashTable[v] = k } return nil }
2. 字母异位词分组
题目大意:多个字符串,如果两个字符串,只有字母顺序不一样,则可以将该字符串化为一组。输出相同组的字符串们。
解题思路:排序+hash
遇到问题主要为 go 不太会写排序,需要处理一下
首次代码
func groupAnagrams(strs []string) [][]string { mp := make(map[string][]string, 0) for _, v := range strs { sorted := sortString(v) mp[sorted] = append(mp[sorted], v) } var ans [][]string for _, v := range mp { ans = append(ans, v) } return ans } func sortString(str string) string { s := []byte(str) sort.Slice(s, func(i, j int) bool {return s[i]<s[j]}) return string(s) }