golang 数组去重

需要对数组去重,一开始懒得写,搜索了下网上的实现,发现要么建立一个新的数组,要么需要多次拷贝。
由于需要处理的量比较大,性能需要尽可能的比较好,所以自己写了个,最悲观的情况下每个元素最多移动一次。

 

package main

import (
	"fmt"
	"sort"
)

func RemoveDuplicate(v []int) []int {
	//为了性能需要尽可能的减小拷贝,最悲观的情况每个元素只移动一次。
	toIndex := 0
	p := 0

	for i, _ := range v {
		// 为了实际去重结构时减小内存拷贝
		c := &v[i]

		if p == *c && i != 0 {
			// 重复内容,跳过
			continue
		}

		if i != toIndex {
			// 需要移动当前元素
			v[toIndex] = *c
		}

		toIndex++
		p = *c
	}

	return v[:toIndex]
}

func main() {
	v := []int{9, 1, 1, 9, 2, 2, 3, 3, 3, 4, 5, 6, 7, 7, 7, 7, 8}

	// 升序排序
	sort.Slice(v, func(i, j int) bool { return v[i] <= v[j] })
	//sort.Ints(v)

	// 去重
	v = RemoveDuplicate(v)

	// 打印结果
	// []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
	fmt.Printf("%#v", v)
}


  WordPress › 错误