找出数组中的重复数字,长度为n,数字分布在0~n-1中。
分析
第一想法理所当然是直接遍历一遍,
测试用例: int[] arr1={1,2,3,4,0,2,5,3}
解法
解法1思路
调用Arrays.sort()
进行排序,通过前后两个元素一一比较,找到相同的元素.
[1] Arrays.sort()
所涉及的排序底层源码。
[2] 哈希表(散列表)的基本概念、计算流程
[3] 快排与归并排序的源码
解法1代码
public void test1(int[] arr){
Arrays.sort(array);
for (int i=0;i<array.length-1;i++){
if (array[i]==array[i+1]){
System.out.println(array[i]+" ");
}
}
}
解法1.2代码
得注意边界条件,最初写成numbers.length<=0
是错的,因为方法的形参已经定义了length所以不可能是length不是0;但是int[] ints = new int[5];
普通new出来的数组也不能写numbers==null;
提交时间:2019-12-27, 语言:Java ,运行时间: 27 ms ,占用内存:9744K
public boolean duplicate(int numbers[],int length,int [] duplication) {
if(numbers==null){
return false;
}
Arrays.sort(numbers);
for (int i=0;i<length-1;i++){
if (numbers[i]==numbers[i+1]){
duplication[0]=numbers[i];
return true;
}
}
return false;
}
解法2思路
借助HashSet 构建一个全新的下标数组,来进行重复查找。
[4] HashSet VS HashMap底层 源码,区别
解法2代码
public void test2(int[] arr){
HashSet<Integer> hashSet = new HashSet<>();
for (int i=0;i<array.length;i++){
if (hashSet.contains(array[i])){
System.out.println(array[i]);
}else {
hashSet.add(array[i]);
}
}
}
解法3思路
最牛逼的思路开始,let’s me 回想一下子。有点轮循的味道,有几个特点,第一,每个元素必定是在他应该所在的位置,如果不在,就在这个位置把所有的元素都查一遍。第二,判断的边界条件把握:?–>arr[i]==i。
[q1] if(i!=arr[i]) 时,只打印一个元素
[q2] 正常情况下,打印出来的形式是2,2,3
解法3代码
public void test3(int[] arr){
for (int i=0;i<arr.length;i++){
// if(i!=arr[i])
while (i!=arr[i]) {
if (arr[i]==arr[arr[i]]){
System.out.println(arr[i]);
break;
}else {
//不等于,元素回归
int j=arr[i];
arr[i]=arr[j];
arr[j]=j;
}
}
}
}