找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入:[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
(来源leecode)
由于题目要求仅找到一个重复数字即可。可以利用Hashset
遍历题目所给数组,并依次添加进集合存储中,若添加失败,则找到了重复的元素。如果遍历结束,并没有添加失败的情况,则数组中没有重复数字。
class Solution {
public int findRepeatNumber(int[] nums) {
int rep=-1;
Set<Integer> set=new HashSet<Integer>();
for (int i = 0; i < nums.length; i++) {
if(!set.add(nums[i])){
rep=nums[i];
}
}
return rep;
}
}
由于题目中有一个条件:长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。因此我们可以把数字放在与它相等的下标位置。例如数字1,我们通过交换将它放在nums[[1]]中。在交换时,判断一下这个位置是否放入了正确的值,如果已经是正确的值,则表明找到重复数字。如果没有重复数字,那么数字的每个数字都应该可以放在与它下标相等的位置上。
class Solution {
public static void swap(int[] nums,int i,int j){
//交换函数
int temp=0;
temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
public int findRepeatNumber(int[] nums) {
int rep=-1;
for (int i = 0; i < nums.length; i++) {
while(nums[i]!=i&&nums[nums[i]]!=nums[i]){
swap(nums,i,nums[i]);
}
if(nums[i]!=i&&nums[i]==nums[nums[i]]){
rep=nums[i];
}
}
return rep;
}
}