剑指Offer算法题——数组中重复的数字(JAVA)

题目描述:找出数组中重复的数字。

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

示例 1:

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

首先我们复习一下相关的数据结构知识:

Set

1.概述和特点

Java.util包   Interface Set<E> extends Collection<E>

特点:Set集合不包含重复元素的集合;没有带索引的方法,所以不能使用普通for循坏遍历。

HashSet对迭代对象的顺序不作任何保证

哈希值

①是JDK根据对象的地址或者字符串数字算出来的int类型的数值

不是对象的地址值

②Object类中有一个方法可以获取对象的哈希值

Public int hashCode()  返回对象的哈希码值

同一次对象多次调用hashCode()方法返回的哈希值是相同的

默认情况下,不同对象的哈希值是不相同的。(通过方法重写,可以实现不同对象的哈希值是相同的

2.HashSet

Java.util      Class HashSet<E> extends AbstractSet<E> implements Set<E>

实现Set接口,由哈希表支持

①特点:

1)底层数据结构是哈希表

2)对集合的迭代顺序不作任何保证,也就是说不保证存储和取出的元素顺序一致

3)没有带索引的方法,所以不能使用普通for循环遍历(可以迭代器和增强for遍历)

4)由于是Set集合,所以是不包含重复元素的集合

思路与题解:

我们利用哈希表(Set)来记录数组的各个数组,将数字每个元素挨个遍历一遍,放入一个新数组中,当查找到重复数组则返回此数组。

算法流程

①初始化HashSet,记为dic

②遍历数组中每个数字:

        当遍历到一个存在与dic中的数字时,说明重复,就返回此数字

        再将此数字添加到dic中

③返回-1

代码:

class Solution {
    public int findRepeatNumber(int[] nums) {
        Set<Integer> dic = new HashSet<>();
        for(int num : nums) {//增强的for循坏
            if(dic.contains(num)) return num;
            dic.add(num);
        }
        return -1;
    }
}

Java String contains() 方法

contains() 方法用于判断字符串中是否包含指定的字符或字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值