Golang Go语言中有什么方法可以在原地删除一个[]string的slice中的所有重复项?

我知道有一种简便的方法就是维护一个 map,将 slice 中的项作为 map 的 key,然后用值统计出现次数。或者也可以直接借助 map 转换成 set。

但是问题来了,假如没有 map 呢?还有什么其他的思路?


Golang Go语言中有什么方法可以在原地删除一个[]string的slice中的所有重复项?
3 回复

排序之后遍历比较前后

更多关于Golang Go语言中有什么方法可以在原地删除一个[]string的slice中的所有重复项?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


#1 谢谢!这的确是一个可行的思路

在Go语言中,原地删除一个[]string slice中的所有重复项可以通过使用一个map来跟踪已经遇到的元素,然后只保留首次出现的元素来实现。下面是一个简洁的示例代码,演示了如何实现这一操作:

func removeDuplicates(slice []string) []string {
    seen := make(map[string]struct{})
    result := slice[:0] // 重新使用原slice的底层数组,避免内存分配

    for _, v := range slice {
        if _, exists := seen[v]; !exists {
            seen[v] = struct{}{}
            result = append(result, v)
        }
    }

    return result
}

func main() {
    slice := []string{"apple", "banana", "apple", "orange", "banana", "grape"}
    uniqueSlice := removeDuplicates(slice)
    fmt.Println(uniqueSlice) // 输出: [apple banana orange grape]
}

在这个示例中,seen map用于记录已经遇到的字符串。result slice初始化为原slice的零长度版本,这样可以使用原slice的底层数组存储结果,从而避免额外的内存分配。然后,遍历原slice,如果元素不在seen中,则将其添加到resultseen中。

这种方法的时间复杂度为O(n),其中n是slice的长度,因为每个元素最多被访问一次。空间复杂度也是O(n),因为需要额外的空间来存储seen map。

回到顶部