剑指offer

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 的主要特点

  1. 不允许有重复元素HashSet 中的元素是唯一的。
  2. 无序存储HashSet 不保证存储元素的顺序,因为它的底层是哈希表。
  3. 性能优越:哈希表提供快速的增、删、查操作,其时间复杂度通常为 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);
}
  1. 初始化哈希表

     

    java

    复制代码

    Set<Integer> hmap = new HashSet<>();
    

    这里我们创建一个空的 HashSet,用于存储遇到的元素。

  2. 遍历数组

     

    java

    复制代码

    for(int doc : documents) {
    

    使用 for-each 循环遍历数组中的每个元素 doc

  3. 检查是否存在于哈希表中

     

    java

    复制代码

    if(hmap.contains(doc)) return doc;
    
    • hmap.contains(doc):检查当前元素 doc 是否已经存在于哈希表 hmap 中。
    • 如果存在,说明这个元素是第一个重复出现的元素,立即返回该元素。
  4. 添加元素到哈希表

     

    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
    }
}

代码执行过程

  1. 创建一个空的 HashSet 存储已经遇到的元素。
  2. 遍历 documents 数组:
    • 遇到 1,不在哈希表中,加入哈希表。
    • 遇到 2,不在哈希表中,加入哈希表。
    • 遇到 3,不在哈希表中,加入哈希表。
    • 遇到 4,不在哈希表中,加入哈希表。
    • 遇到再次出现的 3,已经存在于哈希表中,返回重复的元素 3

使用 HashSet 来检测数组中的重复元素,实现了时间复杂度为 O(n) 的解决方案。哈希表的高效性和简洁性极大简化了问题解决的过程,是检测重复元素的理想选择。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值