程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 唯一的重復元素,重復元素

唯一的重復元素,重復元素

編輯:C++入門知識

唯一的重復元素,重復元素


問題描述:將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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved