面試題:給定一個長度為N的數組,其中每個元素的取值范圍都是1到N。判斷數組中是否有重復的數字


題目:定一個長度為N的數組,其中每個元素的取值范圍都是1到N。判斷數組中是否有重復的數字。(原數組不必保留)

方法1.
對數組進行排序(快速,堆),然后比較相鄰的元素是否相同。
時間復雜度為O(nlogn),空間復雜度為O(1)。

方法2.
使用bitmap方法。
定義長度為N/8的char數組,每個bit表示對應數字是否出現過。遍歷數組,使用 bitmap對數字是否出現進行統計。
時間復雜度為O(n),空間復雜度為O(n)。

方法3.
遍歷數組,假設第 i 個位置的數字為 j ,則通過交換將 j 換到下標為 j 的位置上。直到所有數字都出現在自己對應的下標處,或發生了沖突。
時間復雜度為O(n),空間復雜度為O(1)。

方法3示例代碼如下

#include<iostream>
#include<ctime>
using namespace std;
//判斷數組中是否包含重復數字
const int MAX= 10;

bool isDuplicate(int val[])
{
    for(int i=0;i<MAX;i++)
    {
        if(val[i]!=i)
        {
            if(val[i] != val[val[i]])
                swap(val[i],val[val[i]]);
            else
                return true;
        }
    }
    return false;
}

int main()
{
    int val[MAX];
    srand((unsigned)time(NULL));

    cout<<"init data:"<<endl;
    for(int i=0;i<MAX;i++)
    {
        int tmp=rand()%MAX;
        val[i]=tmp;
        cout<<tmp<<" ";
    }
    cout<<endl;
    bool flag=isDuplicate(val);

     if(flag)  
        cout << "has duplicate elem" << endl;  
    else  
        cout << "no duplicate elem" << endl;  

}

srand((unsigned)time(NULL));

time()頭文件為ctime.這句話不要程序每次運行結果都一樣。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM