每日一题——数组中重复的数据

简介: 每日一题——数组中重复的数据

442. 数组中重复的数据

题目描述:

给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。

你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。

题解:

func findDuplicates(nums []int) []int {
  // 先排序,时间复杂度为O(n)
  sort.Ints(nums)
  // 准备一个指针,下面用到
  count := 0
  for count < len(nums) {
    // 当计数器来到最后一个元素,直接移除即可(这里不懂的话,结合下面的if理解)
    // 如果最后一个元素存在重复,那么肯定在上一个元素的时候就进入了下面的else,count肯定指向最后一个元素的
    // 所以只要count来到最后一位,那么一定是单独的元素。
    if count == len(nums)-1 {
      nums = nums[0:count]
      break
    }
    // 因为 nums 中的每个元素出现 一次 或 两次
    // 所以排序后,若下一个元素不等于自己,说明自己是单独的,直接移除
    if nums[count] != nums[count+1] {
      nums = append(nums[0:count], nums[count+1:]...)
    } else { // 而如果下一个等于自己,说明自己是有重复的,移除一个,留下一个,计数器+1,
      nums = append(nums[0:count], nums[count+1:]...)
      count = count + 1
    }
  }
  return nums
}

提交结果:

相关文章
|
6月前
|
Java
每日一题《剑指offer》数组篇之数组中重复的数字
每日一题《剑指offer》数组篇之数组中重复的数字
55 0
每日一题《剑指offer》数组篇之数组中重复的数字
【剑指offer】- 数组中重复的数字 -48/67
【剑指offer】- 数组中重复的数字 -48/67
|
6月前
剑指Offer 面试题03. 数组中重复的数字
剑指Offer 面试题03. 数组中重复的数字
34 0
剑指offer-2.不修改数组找出重复的数字
剑指offer-2.不修改数组找出重复的数字
47 0
LeetCode-442 数组中重复的数据
LeetCode-442 数组中重复的数据
|
C++
剑指Offer - 面试题3:数组中重复的数字
剑指Offer - 面试题3:数组中重复的数字
70 0
剑指offer 02. 不修改数组找出重复的数字
剑指offer 02. 不修改数组找出重复的数字
65 0
|
C++
剑指offer 01. 找出数组中重复的数字
剑指offer 01. 找出数组中重复的数字
52 0
剑指offer 03. 数组中的重复数字
剑指offer 03. 数组中的重复数字
75 0
剑指offer 03. 数组中的重复数字
|
算法 Java 索引
数组中重复的数字(剑指offer 03)
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。