golang slice去重

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

数据类型如下:

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]
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐墨123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值