非排序数组
应用 struct{}
节俭空间,指定 cap=len(arr)
防止 map 扩容。记录非反复元素索引 j
,将元素前移,原地去重,只需一遍遍历。
工夫复杂度:O(n)
空间复杂度:O(n)
func removeDuplication_map(arr []string) []string {set := make(map[string]struct{}, len(arr))
j := 0
for _, v := range arr {_, ok := set[v]
if ok {continue}
set[v] = struct{}{}
arr[j] = v
j++
}
return arr[:j]
}
已排序数组
工夫复杂度:O(n)
空间复杂度:O(1)
func removeDuplication_sort(arr []string) []string {length := len(arr)
if length == 0 {return arr}
j := 0
for i := 1; i < length; i++ {if arr[i] != arr[j] {
j++
if j < i {swap(arr, i, j)
}
}
}
return arr[:j+1]
}
func swap(arr []string, a, b int) {arr[a], arr[b] = arr[b], arr[a]
}
残缺代码及测试:https://github.com/win5do/pla…
Reference
Idiomatic way to remove duplicates in a slice : golang (reddit.com)
SliceTricks · golang/go Wiki (github.com)