数组中重复的数字

159 阅读2分钟

「这是我参与2022首次更文挑战的第8天,活动详情查看:2022首次更文挑战

题目

找出数组中重复的数字。


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

示例 1:

输入:
[2, 3, 1, 0, 2, 5, 3]
输出: 23 

限制:

2 <= n <= 100000

题目分析

这道题看起来比较简单,主要涉及的哈希表的操作。思路也比较简单,我们可以利用hashset的特性,用set来记录数组的数,如果这个数在set中已经存在了,说明是重复的数字,直接返回就可以了。

代码实现

class Solution {
    public int findRepeatNumber(int[] nums) {
        Set<Integer> set = new HashSet<>();
        for (int num : nums) {
            if (set.contains(num)) {
                return num;
            }
            set.add(num);
        }
        return -1;
    }
}

这是我用java实现的功能,每个题都用不同的解法和写法,我大体整理了一下自己的思路然后就写了,也没有再想其他的方法,如果你有更好的解法,欢迎和我留言,我们一起进步,一起学习数据结构,共同进步,通过这道题能更熟悉集合的操作。

这里用到了Set,set的特性就是进入set集合中的元素不能重复,实现set接口的类有hashset、TreeSet、LinkedHashSet和EnumSet。

hashset的查询速度很快,内部用hashcode来实现,不保证set的顺序,因为它的顺序也是使用hashcode来决定的。

TreeSet是使用二叉树实现的,不允许有null值,而hashset可以从null值的

而LinkedHashSet也是根据hashcode来决定元素的存储位置的,LinkedHashSet是按元素添加的顺序来进行遍历访问的,在迭代过程中LinkedHashSet的性能比HashSet好,但插入的时候不如HashSet

其实这是一种方法,别的方法还有很多,例如利用原地交换也就是使用索引和值进行比较,相同的存相同的值,如果碰撞了就说明已经存在,就返回就可以了。

如果有不当之处,欢迎指正。