题目描述
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。
1 /* 2 *思路: 3 *查找数组中重复的数字: 4 *这题有明确定义数组中的数字大小不超过数组的长度并且大于0,所以可以用散列表来做,这样应该不会内存越界 5 * 6 *位图: 7 *即申请一个数组长度的位图数组,并初始化为0,正好可以以数组的下标作为每个数字的索引,然后位图数组的值作为该索引位置数字出现的次数. 8 *最后扫一遍位图数组,找到第一个值大于1的即可. 9 * 10 *可以用java的数据结构HashMap做,不过就没什么意思了,都没有用到题目的特性. 11 *编程就是应该特殊情况考虑特殊的数据结构. 12 */ 13 14 public boolean duplicate(int numbers[],int length,int [] duplication) 15 { 16 if(length <= 1) 17 { 18 return false; 19 } 20 21 int bitMapNumber[] = new int[length]; 22 23 for(int i = 0; i < length; i++) 24 { 25 bitMapNumber[i] = 0; 26 } 27 28 for(int i = 0; i < length; i++) 29 { 30 bitMapNumber[numbers[i]]++; 31 } 32 33 for(int i = 0; i < length; i++) 34 { 35 36 if(bitMapNumber[i] > 1) 37 { 38 duplication[0] = i; 39 40 return true; 41 } 42 43 } 44 45 return false; 46 }