以前去面试,某个面试题目如下:

数据类型如下:

type ele struct {
	id int
	lastTime time.Time
}

请编写函数,对Id重复的元素,只保留lastTime最新的元素。

分析:先排序后去重速度会比盲目去重要快,按照id排序后需求去重的数据比较集中,比按照时间戳排序要快。 方案如下:

  • 按照id排序
  • 在排序后的slice上面放置窗口滑动块,窗口的范围是:id连续相同的元素
func RemoveDuplicates(islice []ele, dna int) []ele {
	sort.Slice(islice, func(i, j int) bool {
		return islice[i].id < islice[j].id
	})
	
	rslice := make([]ele, dna)
	for i, base, end := 0 , 0, 0; end +1 < len(islice); {
		if islice[base].id == islice[end+1].id {
			if islice[base].lastTime.Before(islice[end+1].lastTime) {
				islice[base].lastTime = islice[end+1].lastTime
			}
			end += 1
		} else {
			rslice[i] = rslice[base]
			end += 1
			base = end
			i += 1
			rslice[i] = islice[base]
		}
	}
}