51. 数组中重复的数字

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

  思路:因为数字在0到n-1的范围,如果没重复的话,下标应该和所指的值相等。所以我们可以从第一个数开始找它相对应的下标。例:{2,3,1,0,2,5,3},从2开始,2应该移到下标为2的位置,也就是和1交换,然后1和3交换,3和0交换。。以此类推,直到发现所在下标的值和即将交换的值一样。

#include<iostream>
using namespace std;

bool duplicate(int numbers[], int length, int* duplication)
{
    if (numbers == NULL || length <= 0)
    {
        return false;
    }

    for (int i = 0; i < length; i++)
    {
        if (numbers[i] < 0 || numbers[i] > length - 1)
        {
            return false;
        }
    }

    for (int i = 0; i < length; i++)
    {
        while (numbers[i] != i)
        {
            if (numbers[i] == numbers[numbers[i]])    //即将交换的数和已存在的数相等,也就是重复了
            {
                *duplication = numbers[i];
                return true;
            }

            //不相等则继续交换
            int temp = numbers[i];
            numbers[i] = numbers[temp];
            numbers[temp] = temp;
        }
    }

    return false;
}

int main()
{
    int a[7] = {6,3,1,0,2,5,3};
    int dup;
    bool result = duplicate(a, 7, &dup);
    if (result = true)
    {
        cout << dup << endl;
    }

    return 0;
}

猜你喜欢

转载自my.oschina.net/134596/blog/1807692