Go每日一练之切片&数组去重复
标签搜索
侧边栏壁纸
  • 累计撰写 9 篇文章
  • 累计收到 1 条评论
Go

Go每日一练之切片&数组去重复

AiiCi
2024-05-24 / 0 评论 / 5 阅读 / 正在检测是否收录...

描述

Go中没有像Python那样的集合函数,可以很快捷的进行去重操作,但实际应用中常常会遇到需要去重的时候。

切片

场景1:已经存在的一个切片要去掉其中重复的内容。一般使用map来进行辅助,map的键可以存储切片中的元素,值设置为布尔类型。示例代码如下:

func removeDuplicates(slice []int) []int {
  //使用map来记录出现过的元素
  seen := make(map[int]bool)
  //创建一个无重复的元素切片
  unique := []int{}
  //遍历原始切片
  for _,value := range slice{
    if _,ok :=seen[value];!ok{
      //如果元素没有出现过,就添加到map和新切片中
      seen[value]=true
      unique = append(unique,value)
    }
  }
  return unique
}

场景2:在进行爬虫操作的时候,用正则表达式获取到的字符串,想要去掉重复的内容。可以通过定义个containers函数进行辅助,如果这个字符串已经在这个数据中则不进行存储。示例代码如下:

func containers(selice []string,target string) bool{
  for _,value := range selice{
    if value == target{
      return true
    }
  }
  return false
}

数组

在Go中处理数组去重有点不同于处理切片,因为数组的大小在声明时就已经固定,无法动态改变。可以通过创建一个新的切片来存放数组中的唯一元素,然后返回这个切片,实际操作和切片差不多,需求注意的就是长度也是数组的一部分。示例代码:

func removeDuplicatesArr(arr [5]int) []int{
  seen := make(map[int]bool)
  unique := []int{}
  for _,value := range arr{
    if _,ok := seen[value]; !ok{
      seen[value]=true
      unique=append(unique,value)
    }
  }
  return unique
}

拓展1:数组/切片中找到重复元素所在的索引。
思路:要找出数组中重复元素的位置,可以利用map来存储每个元素第一次出现的位置,同时检查元素是否已经出现过。如果发现一个元素已经记录在map中,就可以将其位置记录到切片中。

func findDuplicates(arr []int) map[int][]int{
  positions := make(map[int][]int)
  seen :=make(map[int]int)

  for index,value := range arr{
    if firstIndex,found := seen[value];found {
      //如果元素已经出现过,将其位置添加到positions中
      if _,exists := positions[value];exists{
        positions[value]=append(positions[value],index)
      }else{
        positions[value]=[]int{firstIndex,index}
      }
    }else{
      //记录元素第一次出现的位置
      seen[value] = index
    }
  }
  return positions
}

在这个示例中,findDuplicates函数接受一个整数数组,并返回一个map,其中键是数组中的重复元素,值是这些元素出现的所有位置的切片。函数首先遍历数组,记录每个元素首次出现的位置。如果元素已经出现过,就更新该元素在positions中的位置列表。

拓展2:找出数组中重复元素并统计其个数。

func countDuplicates(arr []int) map[int]int {
    countMap := make(map[int]int)
    for _, value := range arr {
        // 每遇到一个元素,就在其对应的计数上加1
        countMap[value]++
    }

    // 可选: 移除只出现一次的元素
    for key, count := range countMap {
        if count == 1 {
            delete(countMap, key)
        }
    }

    return countMap
}
0

海报

正在生成.....

评论 (0)

取消