Golang數組去重&切片去重


合並兩個整型切片,返回沒有重復元素的切片,有兩種去重策略

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM