剑指Offer-数组-面试题3-1:数组中重复的数字


找出数组中的重复数字,长度为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;
                }
            }
       }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值