C++實(shí)例(去除數(shù)組中的重復(fù)數(shù)字)

字號:

題目: 有一個(gè)數(shù)組t[100],存放了1~99之間的數(shù)字,用效率較高的代碼把重復(fù)數(shù)字去掉。例如數(shù)組{1,2,2,2,3,5,6,6}變成{1,2,3,5,6}。
    ××××××××××××××××××××××××××××××××××
    申請標(biāo)志數(shù)組
    此題重復(fù)的數(shù)字可能不只一個(gè),上述求和的方法不行了。因?yàn)槭歉咝?,我們可以采用空間換時(shí)間的策略來解決。
    設(shè)立訪問標(biāo)志數(shù)字,初始化為0,訪問到N時(shí)將標(biāo)志數(shù)字的第N個(gè)元素置為N
    最后遍歷該數(shù)組,若標(biāo)志數(shù)組中對應(yīng)值為非0,則順序存儲該數(shù)字于原數(shù)組中,最后返回去除重復(fù)數(shù)字后的有效數(shù)的個(gè)數(shù)
    int RemoveRep(int array[], int n)
    {
    int *arrayflag = (int *)malloc(n*sizeof(int));
    int left = 0, i = 0;
    while(i    arrayflag[i++] = false; //初始化標(biāo)志數(shù)組
    for(i=0;i    {
    arrayflag[array[i]] = array[i]; //將出現(xiàn)過的數(shù)保存到對應(yīng)的位置
    }
    for(i=0;i    {
    if(arrayflag[i] != false)
    array[left++] = arrayflag[i];
    }
    return left;
    }
    ××××××××××××××××××××××××××××××××××
    符號標(biāo)志法
    上述方法的空間復(fù)雜度為O(N),利用符號位作為標(biāo)志即可不申請O(N)標(biāo)志數(shù)組
    int SignedRemoveRep(int array[], int n)
    {
    int i,left = 0;
    for(i=0;i    {
    if(array[i] > 0)
    array[array[i]] = -array[array[i]];
    else
    array[-array[i]] = -array[-array[i]];
    }
    for(i=0;i    {
    if(array[i] < 0) //根據(jù)標(biāo)志順序保存出現(xiàn)過的值
    array[left++] = i;
    }
    return left;
    }
    ××××××××××××××××××××××××××××××××××
    void main(void)
    {
    int t[100];
    int i,j,left;
    for(i=0;i<100;i++) //隨機(jī)產(chǎn)生100個(gè)數(shù)字
    {
    j = rand()%99+1;
    t[i] = j;
    printf("%d ",t[i]);
    if(i%10 == 9)
    printf("\n");
    }
    //left = RemoveRep(t, 100);
    left = SignedRemoveRep(t, 100);
    for(i=0;i    {
    printf("%d ",t[i]);
    if(i%10 == 9)
    printf("\n");
    }
    }