「这是我参与2022首次更文挑战的第8天,活动详情查看:2022首次更文挑战」
题目
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出: 2 或 3
限制:
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
其实这是一种方法,别的方法还有很多,例如利用原地交换也就是使用索引和值进行比较,相同的存相同的值,如果碰撞了就说明已经存在,就返回就可以了。
如果有不当之处,欢迎指正。