数组中重复的数字

数组中重复的数字

  • 题目描述
    • 解法一 利用Hashset
    • 解法二 将数组中数字放在指定位置

题目描述

找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入:[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
(来源leecode)

解法一 利用Hashset

由于题目要求仅找到一个重复数字即可。可以利用Hashset
遍历题目所给数组,并依次添加进集合存储中,若添加失败,则找到了重复的元素。如果遍历结束,并没有添加失败的情况,则数组中没有重复数字。

class Solution {
     
    public int findRepeatNumber(int[] nums) {
     
        int rep=-1;
        Set<Integer> set=new HashSet<Integer>();
        for (int i = 0; i < nums.length; i++) {
     
            if(!set.add(nums[i])){
     
                rep=nums[i];
           
            }
        }
        return rep;    
    }
}

解法二 将数组中数字放在指定位置

由于题目中有一个条件:长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。因此我们可以把数字放在与它相等的下标位置。例如数字1,我们通过交换将它放在nums[[1]]中。在交换时,判断一下这个位置是否放入了正确的值,如果已经是正确的值,则表明找到重复数字。如果没有重复数字,那么数字的每个数字都应该可以放在与它下标相等的位置上。

class Solution {
     
     public static void swap(int[] nums,int i,int j){
     	
     //交换函数
        int temp=0;
        temp=nums[i];
        nums[i]=nums[j];
        nums[j]=temp;
    }
    public int findRepeatNumber(int[] nums) {
     
      int rep=-1;
        for (int i = 0; i < nums.length; i++) {
     
            while(nums[i]!=i&&nums[nums[i]]!=nums[i]){
     
                swap(nums,i,nums[i]);
            }
            if(nums[i]!=i&&nums[i]==nums[nums[i]]){
     
                rep=nums[i];
            }
        }
        return rep;  
    }
}

你可能感兴趣的:(剑指offer,java,leetcode)