非排序数组

应用 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)