合並兩個整型切片,返回沒有重復元素的切片,有兩種去重策略
1. 通過雙重循環來過濾重復元素(時間換空間)
// 通過兩重循環過濾重復元素
func RemoveRepByLoop(slc []int) []int {
result := []int{} // 存放結果
for i := range slc{
flag := true
for j := range result{
if slc[i] == result[j] {
flag = false // 存在重復元素,標識為false
break
}
}
if flag { // 標識為false,不添加進結果
result = append(result, slc[i])
}
}
return result
}
2. 通過字典來過濾(空間換時間)
// 通過map主鍵唯一的特性過濾重復元素
func RemoveRepByMap(slc []int) []int {
result := []int{}
tempMap := map[int]byte{} // 存放不重復主鍵
for _, e := range slc{
l := len(tempMap)
tempMap[e] = 0
if len(tempMap) != l{ // 加入map后,map長度變化,則元素不重復
result = append(result, e)
}
}
return result
}
ps : 這里為了節省內存,使用map[int]byte。 因為map的value並沒有用到,所以什么類型都可以。
效率第一,如果節省計算時間,則可以采用如下方式
// 元素去重
func RemoveRep(slc []int) []int{
if len(slc) < 1024 {
// 切片長度小於1024的時候,循環來過濾
return RemoveRepByLoop(slc)
}else{
// 大於的時候,通過map來過濾
return RemoveRepByMap(slc)
}
}
ps: 1024 這個數字不是特別精准,我是使用go test 的基准測試,手工的比較的。大約在這個數量超上,使用map方式的速度要快,小於這個數量級后,loop方式要快,而且省內存。
原文:https://blog.csdn.net/qq_27068845/article/details/77407358