编程语言
首页 > 编程语言> > 四种方式带你层层递进解剖算法---hash表不一定适合寻找重复数据

四种方式带你层层递进解剖算法---hash表不一定适合寻找重复数据

作者:互联网

一、题目描述

找出数组中重复的数字

> 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

二、思路分析

考察点

三、代码+解析

初版

public int findRepeatNumber(int[] nums) {
    //构建hash表 。 Java中Map天生的Hash表
    Map<integer, object=""> map = new HashMap&lt;&gt;();
    for (int num : nums) {
        //已经在hash表中存在的说明数据重复
        if (map.containsKey(num)) {
            return num;
        }
        //没有重复的数据需要添加到hash表中
        map.put(num, num);
    }
    return 0;
}

image-20210518174357388

首次升级

升级点

优化落地

public int findRepeatNumber(int[] nums) {
    Arrays.sort(nums);
    for (int i = 1; i &lt; nums.length; i++) {
        if (nums[i] == nums[i - 1]) {
            return nums[i];
        }
    }
    return 0;
}

image-20210518184330732

再次升级

升级点

image-20210518185932498

public int findRepeatNumber(int[] nums) {
    Arrays.sort(nums);
    for (int i = 0; i &lt; nums.length; i++) {
        int index =i;
        while (index  != nums[index]) {
            index = nums[index];
        }
        if (index != i) {
            return index;
        }
    }
    return 0;
}

image-20210518190053631

最终升级

升级点

public int findRepeatNumber(int[] nums) {
    for (int i = 0; i &lt; nums.length; i++) {
        while (i != nums[i]) {
            if (nums[i] == nums[nums[i]]) {
                return nums[i];
            }
            nums[i] = nums[i] ^ nums[nums[i]];
            nums[nums[i]] = nums[nums[i]]^nums[i];
            nums[i] = nums[i] ^ nums[nums[i]];
        }
    }
    return 0;
}

image-20210518192933237

四、总结

> 最后还得送各位兄弟一句话,关注、点赞、收藏不能忘。万一哪天你找不到我了呢

</integer,>

标签:hash,nums,int,---,内存,数组,表不,return
来源: https://www.cnblogs.com/zhangxinhua/p/14788484.html