示例1
在一个长度为n的数组里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次,请找出数组中任意一个重复数字。
方法一
利用HashSet的特性,如果遇到重复添加则会返回-1。(较为通用,不管数字范围或是不是数字)
public int findRepeatNumber(int[] nums) {
Set<Integer> sets = new HashSet<>();
int size = nums.length;
for(int i=0;i<size;i++){
if(!sets.add(nums[i]))
return nums[i];
}
return -1;
}
方法二
一个萝卜一个坑的思想可以解决这个问题。由于数字的范围在0-n-1内,因此每个数字都会对应一个下标。从头开始扫描,如果第i个元素是m,则与第m个元素交换,当在交换中遇到了相同的元素,则返回该元素。
public int findRepeatNumber(int[] nums){
int size = nums.length;
int temp;
for(int i=0;i<size;i++){
if(nums[i] == nums[nums[i]])
return nums[i];
else{
temp = nums[nums[i]];
nums[nums[i]] = nums[i];
nums[i] = temp;
}
}
return -1;
}
方法三
排序之后,重复的元素必相邻,排好序之后再扫描一遍即可。