数组中重复的数字
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
- 简单昏析:
- 暴力双循环,两两异或,异或值为0时满足(最笨,条件也没用完)。
public class Solution {
public int findRepeatNum(int[] nums){
for(int i=0;i<nums.length;i++){ // 1、暴力解法
for (int j=nums.length-1;j>i;j--){
if((nums[i]^nums[j])==0){
return nums[i];
}
}
}
return -1;
}
}
- 修改原数据结构,排序后遍历。(不太好)
import java.util.Arrays;
public class Solution {
public int findRepeatNum(int[] nums){
Arrays.sort(nums);
for (int i=0;i<nums.length;i++){
if (nums[i]==nums[i+1]){
return nums[i];
}
}
return -1;
}
}
- 集合元素添加。利用元素不可重复性质,判断重复。
import java.util.HashSet;
import java.util.Set;
public class Solution {
public int findRepeatNum(int[] nums){
Set<Integer> set = new HashSet<Integer>();
int res = -1;
for (int num : nums) {
if (!set.add(num)) {//添加失败 逮到重复
res = num;
break;
}
}
return repeat;
}
}
- 充分利用数组长度和元素值的范围,对重复元素做统计。
public class Solution {
public int findRepeatNum(int[] nums){
int length=nums.length;
int[] array=new int[length];//默认数组所有值为0
for (int i:nums){
array[i]++; //每当找到一个位置与大小对应存在的元素 对应位置的默认元素加1
if (array[i]>1){ //说明不止一个 有重复
return i;
}
}
return -1;
}
}