面试题03. 数组中重复的数字

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 tmp = nums[i];
                nums[i] = nums[tmp];
                nums[tmp] = tmp;
            }
        }
        return 0;
    }
}

数组中的数字都在0~n-1范围内。如果这个数组没有重复元素,那么在对这个数组排完序后,数字 i 将出现在下标 i 处。有些位置可能存在多个数字,同时有些位置可能没有数字。

遍历数组,当扫描到下标为 i 的数字时,首先比较这个数字(用m表示)是不是等于i。

如果是,则接着扫描下一个数字;如果不是,则再拿他和第m个数字进行比较。如果他和第m个数字相等,就找到了一个重复的数字;如果他和第m个数字不相等,就把第i个数字和第m个数字交换

接下来重复这个比较和交换的过程,直到我们发现一个重复的数字。

猜你喜欢

转载自www.cnblogs.com/hzqshuai/p/12304802.html