003, 数组中重复的数字

https://github.com/CyC2018/Interview-Notebook/blob/master/notes/%E5%89%91%E6%8C%87%20offer%20%E9%A2%98%E8%A7%A3.md#3-%E6%95%B0%E7%BB%84%E4%B8%AD%E9%87%8D%E5%A4%8D%E7%9A%84%E6%95%B0%E5%AD%97

3. 数组中重复的数字

题目描述

在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。例如,如果输入长度为 7 的数组 {2, 3, 1, 0, 2, 5, 3},那么对应的输出是第一个重复的数字 2。

https://blog.csdn.net/jsqfengbao/article/details/47438557

https://www.cnblogs.com/AndyJee/p/4693099.html

结题思路:

以数组{2,3,1,0,2,5,3}为例来分析找到重复数字的步骤。数组的第0个数字(从0开始计数,和数组的下标保持一致)是2,与它的下标不想等,于是把它和下标为2的数字1交换,交换后的数组是{1,3,2,0,2,5,3}。此时第0 个数字是1,仍然与它的下标不想等,继续把它和下标为1的数字3交换,得到数组{0,1,2,3,2,5,3}。此时第0 个数字为0,接着扫描下一个数字,在接下来的几个数字中,下标为1,2,3的三个数字分别为1,2,3,他们的下标和数值都分别相等,因此不需要做任何操作。接下来扫描下标为4的数字2.由于它的值与它的下标不登,再比较它和下标为2的数字。注意到此时数组中下标为2的数字也是2,也就是数字2和下标为2和下标4的两个位置了,因此找到一个重复的数字。

public boolean duplicate(int[] nums, int length, int[] duplication) {
    if (nums == null || length <= 0) return false;
    for (int i = 0; i < length; i++) {
        while (nums[i] != i && nums[i] != nums[nums[i]]) {
            swap(nums, i, nums[i]);
        }
        if (nums[i] != i && nums[i] == nums[nums[i]]) {
            duplication[0] = nums[i];
            return true;
        }
    }
    return false;
}

private void swap(int[] nums, int i, int j) {
    int t = nums[i]; nums[i] = nums[j]; nums[j] = t;
}

你可能感兴趣的:(003, 数组中重复的数字)