【剑指offer】050-数组中重复的数字

题目

在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。

方法

参考:http://wiki.jikexueyuan.com/project/for-offer/question-fifty-one.html

思路

利用题目数组的特性,数组长度为n,值都在0到n-1。假设数组中没有重复的数字,这n个数分别是0,1,2,…,到n。所以下标i的位置就是数字i。
利用这个特性重排数组,并在排序过程中判断是否有重复的值。因为数字i如果不在下标i,并且下标i的数字又已经是数字i了,那么就存在重复数字

具体办法

从下标0开始循环判断,该下标i是否等于该下标的数m,等于则循环判断下一个下标
不等于,则判断数字m正确位置的数number[m]是否于m相等,相等则存入duplication[0],不相等则将i和m的数字交换,将m交换到正确位置。交换完还需要再循环判断位置i的数字,直到找到重复数字或者位置正确

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function duplicate (numbers, duplication{
  // write code here
  //这里要特别注意~找到任意重复的一个值并赋值到duplication[0]
  //函数返回True/False
  for (let i = 0; i < numbers.length; i++) {
    for (let j = i + 1; j < numbers.length; j++) {
      if (numbers[i] === numbers[j]) {
        duplication[0] = numbers[i]
        return true
      }
    }
  }
  return false
}
文章作者: ptp
文章链接: https://youyingjie114.github.io/2019/11/07/jz-offer/jz-offer-050/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 PTP'S BLOG