经典算法题:数组中重复出现的数字

今天给你们带来的是一道剑指offer上的题目,也是一道很经典的题目,常常在面试中出现,下面咱们来看一下题目描述吧java

题目说明:在一个长度为 n 的数组 nums 里的全部数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每一个数字重复了几回。请找出数组中任意一个重复的数字。面试

示例 1:算法

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

题目解析:该题题意很容易理解,只须要找出数组中的某一重复出现的数字便可。markdown

排序遍历法:spa

咱们今天主要经过三种作法解决该题,第一种方法咱们能够先对其排序,而后进行遍历当发现重复元素时咱们直接返回该元素便可,这种方法比较容易理解,也比较容易实现,你们能够试一下。code

class Solution {
    public int findRepeatNumber(int[] nums) {
         Arrays.sort(nums);//排序
         //循环遍历
         for(int i = 1; i<nums.length ;i++){
            //若是相等则返回
             if(nums[i] == nums[i-1]){
                 return nums[i];
             }
         }
         return -1;
    }
}
复制代码

哈希表:orm

第二种方法就是借助咱们的哈希表,遍历数组,利用哈希表存储遇到过的数字,若是哈希表已经存储过该数字则直接返回便可。这种方法也比较简单。视频

下面咱们来看代码吧排序

class Solution {
    public int findRepeatNumber(int[] nums) {
        HashSet<Integer> arr = new HashSet<>();      
        for(int num:nums){
            //若是已经存在则返回
            if(arr.contains(num)){
                return num;
            }
            //不存在则存入
            arr.add(num);
        }
        return 0;
    }
}
复制代码

原地置换:

下面咱们看一下这个原地置换法,原地置换的整体思路就是将咱们的元素放到他的索引位置。咱们能够这样理解,每一个人都有本身的位置,咱们须要和别人调换回到属于本身的位置,调换以后,若是发现咱们的位置上有人了,并且还和你同样则返回。大体意思了解了,下面咱们代码的执行过程吧。

重复出现的数字

题目代码:

class Solution {
    public int findRepeatNumber(int[] nums) {
       for(int i = 0;i < nums.length;i++){
           //将当前索引下的元素归位
           while(nums[i] != i){
               //发现相同数字,返回
               if(nums[i] == nums[nums[i]]){
                   return nums[i];
               }
               //将当前索引下的数字放到属于他的位置,具体过程参考视频视频
               int temp = nums[i];
               nums[i] = nums[temp];
               nums[temp] = temp;
           }
       }
       return -1;
    }
}
复制代码

你们若是能感受到这个文章写的很用心的话,能给您带来一丢丢帮助的话,能麻烦您给这个文章点个赞吗?这样我就巨有动力写下去啦


你们须要更多经典题目的动图详解能够关注公众号:袁厨的算法小屋,更多精选算法题等着你呀,原创不易,感谢观看

相关文章
相关标签/搜索