日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C語言計算連續無序數組中缺省數字方法詳解_C 語言

作者:36°熨斗的焦慮日記 ? 更新時間: 2023-04-18 編程語言

求缺省數字時可以使用異或進行求解,時間復雜度為O(N)。

我們都知道,異或的特點就是相同為0,相異為1 ,比如:

這是3和3相異或的結果,為0, 同樣地,有4^4 = 0,5^5 = 0等等……

這也是我們思考這道題的出發點:

既然相同異或就為0,那么我們是不是只要將此數組與一個完整數組(個人習慣稱為完全數組)挨個求異或,相同的數字就會被異或沒,剩下的那個數字(這個數字是在完全數組中留下的)是不是就是題給數組的缺省數字?

答案是肯定的:

此時剩下的數字就是4即為所求。

但是我們怎么樣用代碼去實現呢?

本質上是兩兩求異或,非要兩個數組的數字對應相異或嗎?(1-1,2-2,3-3,5-5,6-6,7-7)

我們可以很快的實現一個完全數組的創建,找到缺省數組的最小值,往后加(N+1)個數便可得到,但是如果題給的數組是亂序呢?我們無法做到一一對應去求異或。

于是,奇妙的異或運算便替我們省去了很多步驟。

異或運算是有交換律的,即:a⊕b = b⊕a;

難理解的話我們來看一個例子:

假如現在有一個數組:{1,2,1,3,4};其中有兩個 1 重復了,我已如果對這個數組進行兩兩異或結果是不是應該為2^3^4的值呢?

很顯然,異或消去相同數并不需要對應,只要讓這個數字最終和一個跟它相同的數字異或就可以消去;所以,我們可以將完全數組與缺省數組混合起來成為一個數組兩兩異或,就可以求出那個缺省數字。

思想就是這個樣子,但是在實現時,如果要將兩個數組合并為一個數組又得有多余的步驟,所以我的做法是將兩個數組各自兩兩異或、得到結果A和結果B;再將A與B異或得到缺省數字。

拙解

#include <stdio.h>
int fun(int arr[], int len);
int main() 
{
    int arr[] = { 78, 79, 81, 83, 82, 84 };
    int len = sizeof(arr) / sizeof(arr[0]);
    int res = fun(arr, len);
    printf("%d\n", res);
    return 0;
}
int fun(int arr[], int len)
{
    int i, j;
    int temp1 = 0, temp2 = 0;
    int min = arr[0];
    //確定完全數組起始值
    for (i = 0; i < len; i++)
    {
        if (arr[i] < min)
        {
            min = arr[i];
        }
    }
    //對完全數組進行異或
    for (j = min; j < (len + 1)+min; j++)
    {
        temp1 ^= j;
    }
    //對原始(缺數)數組進行異或
    for (i = 0; i < len; i++)
    {
        temp2 ^= arr[i];
    }
    int res = temp1 ^ temp2;
    return res;
}

原文鏈接:https://blog.csdn.net/leadera_/article/details/128262279

欄目分類
最近更新