LCR 120. 寻找文件副本
简单
相关标签
相关企业
设备中存有 n
个文件,文件 id
记于数组 documents
。若文件 id
相同,则定义为该文件存在副本。请返回任一存在副本的文件 id
。
示例 1:
输入:documents = [2, 5, 3, 0, 5, 0] 输出:0 或 5
提示:
0 ≤ documents[i] ≤ n-1
2 <= n <= 100000
//hash set使用
class Solution {
public int findRepeatDocument(int[] documents) {
Set<Integer> hmap = new HashSet<>();
for(int doc : documents) {
if(hmap.contains(doc)) return doc;
hmap.add(doc);
}
return -1;
}
}
//手动hash set
class Solution {
public int findRepeatDocument(int[] documents) {
int i = 0;
while(i < documents.length) {
if(documents[i] == i) {
i++;
continue;
}
if(documents[documents[i]] == documents[i]) return documents[i];
int tmp = documents[i];
documents[i] = documents[tmp];
documents[tmp] = tmp;
}
return -1;
}
}
作者:Krahets
链接:https://leetcode.cn/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/solutions/96623/mian-shi-ti-03-shu-zu-zhong-zhong-fu-de-shu-zi-yua/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
java hashset(Set<Integer> hmap=new HashSet<>();)
在 Java 中,HashSet
是一种常用的数据结构,这里我们谈论哈希表的使用,这段代码中用它来检测数组中的重复元素。我们逐步解释 HashSet
这个数据结构的用法及其在当前代码中的应用。
HashSet
简介
HashSet
是 Java 集合框架中的一个实现,它基于哈希表(Hash Table)结构来存储元素。哈希表是一种通过哈希函数(Hash Function)将元素映射到对应位置的数据结构,它能提供高效的元素查找、插入和删除操作。
HashSet
的主要特点
- 不允许有重复元素:
HashSet
中的元素是唯一的。 - 无序存储:
HashSet
不保证存储元素的顺序,因为它的底层是哈希表。 - 性能优越:哈希表提供快速的增、删、查操作,其时间复杂度通常为 O(1)。
常用方法
- 添加元素:
add(E e)
- 删除元素:
remove(Object o)
- 检查是否包含某元素:
contains(Object o)
- 获取元素数量:
size()
- 清除所有元素:
clear()
示例代码解释
问题描述
假设我们有一个整型数组 documents
,需要找出其中第一个重复出现的元素。使用 HashSet
可以高效地解决这个问题。
示例代码
我们以下面的代码为例来解释:
java
复制代码
Set<Integer> hmap = new HashSet<>();
for(int doc : documents) {
if(hmap.contains(doc)) return doc;
hmap.add(doc);
}
-
初始化哈希表:
java
复制代码
Set<Integer> hmap = new HashSet<>();
这里我们创建一个空的
HashSet
,用于存储遇到的元素。 -
遍历数组:
java
复制代码
for(int doc : documents) {
使用
for-each
循环遍历数组中的每个元素doc
。 -
检查是否存在于哈希表中:
java
复制代码
if(hmap.contains(doc)) return doc;
hmap.contains(doc)
:检查当前元素doc
是否已经存在于哈希表hmap
中。- 如果存在,说明这个元素是第一个重复出现的元素,立即返回该元素。
-
添加元素到哈希表:
java
复制代码
hmap.add(doc);
hmap.add(doc)
:将当前元素doc
添加到哈希表hmap
中。
完整代码示例
假设我们有 documents
数组,完整的代码如下:
java
复制代码
import java.util.HashSet;
import java.util.Set;
public class Solution {
public int findRepeatNumber(int[] documents) {
Set<Integer> hmap = new HashSet<>();
for (int doc : documents) {
if (hmap.contains(doc)) {
return doc; // 找到第一个重复的元素
}
hmap.add(doc); // 添加元素到哈希表
}
return -1; // 如果没有重复元素,返回-1(或其他适当值)
}
public static void main(String[] args) {
Solution sol = new Solution();
int[] documents = {1, 2, 3, 4, 3, 5, 6}; // 示例数组
System.out.println(sol.findRepeatNumber(documents)); // 输出:3
}
}
代码执行过程
- 创建一个空的
HashSet
存储已经遇到的元素。 - 遍历
documents
数组:- 遇到
1
,不在哈希表中,加入哈希表。 - 遇到
2
,不在哈希表中,加入哈希表。 - 遇到
3
,不在哈希表中,加入哈希表。 - 遇到
4
,不在哈希表中,加入哈希表。 - 遇到再次出现的
3
,已经存在于哈希表中,返回重复的元素3
。
- 遇到
使用 HashSet
来检测数组中的重复元素,实现了时间复杂度为 O(n) 的解决方案。哈希表的高效性和简洁性极大简化了问题解决的过程,是检测重复元素的理想选择。