题解 | #数组中重复的数字#

数组中重复的数字

http://www.nowcoder.com/practice/6fe361ede7e54db1b84adc81d09d8524

思路

根据题意,找出重复的数字,很明显这是一个统计问题,大部分统计问题都可以用hash表来解决,但该题的本意并不是单纯考查hash表的用法,而是对hash表为啥可以快速查找的底层原理进行简单的考查,所以本题更优的做法是自己写一个简单的hash表完成该题。

方法一 直接用HashSet

    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param numbers int整型一维数组 
     * @return int整型
     */
    public int duplicate (int[] numbers) {
        // write code here
        HashSet<Integer> set = new HashSet<>();
        
        for(int i = 0; i < numbers.length; i++) {
            if(set.contains(numbers[i])) {
                return numbers[i];
            }else{
                set.add(numbers[i]);
            }
        }
        
        return -1;
    }
}

方法二(自己写一个简单hashset)

hash表的底层原理可以想象成在空间中有N个桶子用来装存进去的对象,但是在存数的时候有一定规则,用对象的hashcode值对N求余数,余数就对应着对象应该存入第几个桶子。用这种方法,当要查询某对象是否在hashset里时,只需要对象的hashcode的值对N求余数,最后根据余数去对应的桶子取对象即可,时间复杂度为O(1) 根据这一原理,创建数组大小为N的数组来统计重复元素,代码如下

    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param numbers int整型一维数组 
     * @return int整型
     */
    public int duplicate (int[] numbers) {
        // write code here
        int[] set = new int[numbers.length];
        
        for(int i = 0; i < numbers.length; i++) {
            int index = numbers[i] % numbers.length;
            if(set[index] == 1) {
                return numbers[i];
            }else{
                set[index] = 1;
            }
        }
        
        return -1;
    }
}
全部评论

相关推荐

02-10 12:23
已编辑
新余学院 C++
采集想要offer:专业技能那里要一条一条的列出来吧,感觉你项目很厉害了,但是如果你不写技术栈面试官对你项目不太懂的话都没办法问你八股😂C++都是基架岗,都是一群9✌🏻在卷,我觉得你要是有时间学个go把MySQL和redis写上去找个开发岗吧
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务