剑指Offer面试题03-找出数组中重复的数字(5种方法)

本文详细介绍了五种找出数组中重复数字的方法:1) 统计个数,通过创建桶来记录每个数字出现的次数;2) 利用哈希表,借助HashSet的唯一性特性;3) 排序后比较相邻元素;4) 原地置换,通过交换将元素归位;5) 暴力双重循环。其中,方法4和5涉及修改原数组或使用额外空间,其他方法则不改变原数组。
摘要由CSDN通过智能技术生成

题目:

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

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

限制:2<=n<=100000

题目很好理解,没有什么需要分析的部分.既然n个数字,范围却是0~n-1,肯定有重复的.

一.统计个数

题目是为了找重复的数字,最简单的方法就是把他们出现的次数都统计出来,结果大于1的,自然就是重复了.像桶排序一样,先创建桶,这里是下标,因为正好给定的数组的元素个数是 n ,数值范围是 0 ~ n-1.那么就可以用下标代表某个数字,然后对应的值来代表出现的个数.

class Solution {
   
    public int findRepeatNumber(int[] nums) {
   
    	//新建一个数组,下标代表原数组中的元素,因此下标只需要到n-1
        int[] count=new int[nums.length];
        int ans=0;
        for(int i:nums){
   
            if(count[i]==0){
   
                count[i]++;
            }else{
   
                ans=i;
                break;
            }
        }
        re
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值