zoukankan      html  css  js  c++  java
  • 唯一的重复元素

    问题描述:将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

  • 相关阅读:
    ==和equals区别
    如何创建一个不可变类
    mysql用户的创建和授权
    事务
    Java知识点检测
    Redis
    正则表达式中match的用法
    rfind的用法
    找出文件夹里所有的文件路径
    合并多个pdf文件
  • 原文地址:https://www.cnblogs.com/zpfbuaa/p/5366221.html
Copyright © 2011-2022 走看看