题目描述:
找出数组中重复的数字。在一个长度为 n n n 的数组 n u m s nums nums 里的所有数字都在 0 ~ n − 1 0~n-1 0~n−1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例1
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
解题思路:
思路一:利用哈希表的性质,一个
k
e
y
key
key对应一个
v
a
l
u
e
value
value,首先遍历数组,然后加入到哈希表中,如果添加失败,说明这个数字已经加入过了,则跳出遍历。
java代码
解法一
class Solution {
public int findRepeatNumber(int[] nums) {
Set<Integer> set= new HashSet <Integer>();
int res=-1;
for(int num:nums){
if(!set.add(num)){
res=num;
break;
}
}
return res;
}
}
思路二:利用下标进行交换,保证下标
=
=
==
==元素值
解法二
class Solution {
public void swap(int[] nums,int i,int j){
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
public int findRepeatNumber(int[] nums) {
int n=nums.length;
for(int num:nums){
if(num<0 || num>=n)
return -1;
}
//利用下标进行交换,保证下标==元素值
for(int i=0;i<n;i++){
while(nums[i]!=i && nums[nums[i]]!=nums[i])
swap(nums,i,nums[i]);
if(nums[i]!=i && nums[nums[i]]==nums[i])
return nums[i];
}
return -1;
}
}