以前去面试,某个面试题目如下:
数据类型如下:
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]
}
}
}