题目
在一个长度为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 | function duplicate (numbers, duplication) { |