数组中的重复数字
题目
在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。
eg
Input:
{2, 3, 1, 0, 2, 5}
Output:
2
解法
- 根据题目数组中元素的值始终都是小于数组元素个数的。可以将值为i的元素调整到第i个位置上进行求解。在调整过程中,如果第i个位置上已经有了一个值为i的元素,那么就可以确定这个值是重复的。
public class Solution { // Parameters: // numbers: an array of integers // length: the length of array numbers // duplication: (Output) the duplicated number in the array number,length of duplication array is 1,so using duplication[0] = ? in implementation; // Here duplication like pointor in C/C++, duplication[0] equal *duplication in C/C++ // 这里要特别注意~返回任意重复的一个,赋值duplication[0] // Return value: true if the input is valid, and there are some duplications in the array number // otherwise false public boolean duplicate(int[] numbers,int length,int[] duplication) { //先判断参数是否有问题 if(numbers == null || length <= 0){ return false; } //进行判断以及交换 for(int i = 0; i < length; i++) { while(numbers[i] != i) { if(numbers[i] == numbers[numbers[i]]) { duplication[0] = numbers[i]; return true; } swap(numbers, i, numbers[i]); } } return false; } //创建交换函数 private void swap(int[] nums, int i, int j) { int t = nums[i]; nums[i] = nums[j]; nums[j] = t; }
}
```
重点:第i个位置上的数字是numbers[i],这个数字如果没有重复的话应该在numbers[numbers[i]]上,如果是存在重复值的话,那么numbers[numbers[i]]就会等于numbers[i]
-
使用排序,将所有数组进行排序之后再进行查找是否有重复。
-
使用嵌套for循环。对数组进行扫描查找是否有重复的数字。