唯一的重复元素

问题描述:将1~1000放在含有1001个元素的数组中,只有唯一的一个元素重复,其他均出现一次。请设计一个算法,将这个唯一重复的元素找出来,要求每个数组元素只能访问一次,且不能使用辅助存储空间。

 解决方法1:根据题目描述只要将数组中的1001个数求和得到sum0,然后减去1到1000的和sum1就可以得到这个唯一的重复数字。

 参考代码:

#include <bits/stdc++.h>

using namespace std;

int main()
{
    srand(time(NULL));
    int pos = rand() % 1002 ;
    int num = rand() % 1002 ;
    cout<<"随机产生的数字为: "<<num<<endl ;
    int sum0 = 0 ;
    int sum1 = 0 ;
    for( int i = 1 ; i <= 1000 ; i ++ )
    {
        if( i == pos)
        {
            sum0 += num ;
            sum0 += pos ;
        }
        else
        {
            sum0 += i ;
        }
        sum1 += i ;
    }
    cout<<"唯一重复的数字为: "<<sum0 - sum1<<endl;
}

GCC运行结果:

解题方法2:

该方法根据异或 a^b^a = b; 那么我们可以让出现两次的进行多进行一次异或,出现一次的多进行一次异或,也就是a^b^a^a^b =a;  

(因为a^b^a=b  b^a^b=a)

参考代码:

#include <bits/stdc++.h>

using namespace std;
int findRepeat(const int a[])
{
    int temp = a[0] ;
    for( int i = 1 ; i <1001 ; i ++ )
    {
        temp ^= i;
        temp ^= a[i];
    }
    return temp;
}
int main()
{
    srand(time(NULL)) ;
    int num = rand() % 1002 ;
    cout<<"随机产生的数字为: "<<num<<endl ;
    int a[1001] ;
    memset( a , 0 , sizeof( a ) ) ;
    a[0] = num ;
    for( int i = 1 ; i < 1001 ; i ++ )
    {
        a[i] = i ;
    }
    cout<<"唯一重复的数字为: "<<findRepeat(a)<<endl;
}

GCC运行结果:

希望能够得到其他的解决方法。

转载请注明: http://www.cnblogs.com/zpfbuaa

原文地址:https://www.cnblogs.com/zpfbuaa/p/5366221.html