中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》
  • 首頁 > 
  • 教程 > 
  • 開發技術 > 
  • 編程語言 > 
  • C語言實現一個int類型數組里除了兩個數字之外,其他的數字都出現了兩次,找出這兩個數字

C語言實現一個int類型數組里除了兩個數字之外,其他的數字都出現了兩次,找出這兩個數字

發布時間:2020-08-03 09:09:15 來源:網絡 閱讀:512 作者:夢T醒 欄目:編程語言

題目是這樣敘述的:
在一個數組中除兩個數字只出現1次外,其它數字都出現了2次, 要求盡快找出這兩個數字。

要求:時間復雜度為O(N),空間復雜度為O(1)。

請看我的分析:
將這道題簡單化:
一個數組中只有一個數字出現一次,其他數字都是成對出現的,這時我們可以根據異或運算符的特性:A^B^A = B; 0 ^ A = A;我們可以將這個數組的全部元素依次做異或運算,最終結果就是那個只出現一次的數字。
不會的可看本人(2019-04-04)那天的博客

如果這個數組中出現兩個不同的數字,而其他數字均出現兩次,假設這兩個數字分別是x, y。那如果可以將x, y分離到兩個數組。這時這道題就變成兩個我們簡化之后的版本中的數組了。這樣問題就可以得到解決了。由于x,y肯定是不相等的,因此在二進制上必定至少有一位是不同的。根據這一位是0還是1可以將x,y分開到A組和B組。并且數組中其他元素也可以根據這個方法劃分到兩個數組中。這時將兩個數組分別做異或運算,結果就是這兩個數字。
#include<stdio.h>

#define SIZE(arr) sizeof(arr)/sizeof(arr[0])

void find_num(int *arr, int len,int *num1,int *num2)
{
    int i;
    int sum = 0;
    for (i = 0; i < len; i++)
    {
        sum^=*(arr + i);//異或出所有數字
    }
    int j;
    for (j = 0; j < sizeof(int)* 8; j++)//int類型數組的字節數32
    {
    //if(sum>>j&1==1)也正確,不知道優先級,盡量加上,下面一樣
        if (((sum >> j) & 1) == 1)//說明sum在右移 j 個單位后,二進制不一樣
        {
            break;
        }
    }
    for (i = 0; i < len; i++)
    {
        if (((*(arr + i) >> j) & 1) == 1)
        {
            *num1 ^= (*(arr + i));//異或 j 位置為1的一組數字
        }
        else
        {
            *num2 ^= (*(arr + i));//異或 j 位置為0的一組數字
        }
    }
}

int main()
{
    int arr[] = { 1, 3, 5, 7, 1, 3, 5, 9 };
    int num1=0, num2=0;
    find_num(arr,SIZE(arr),&num1,&num2);
    printf("%d %d", num1, num2);
    return 0;
}

總結:復雜問題簡單化,把兩個出現一次的數字分割為兩組出現一次的數組

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

启东市| 青川县| 错那县| 乾安县| 天门市| 巩义市| 凤台县| 兰溪市| 垣曲县| 台南县| 吉林市| 榆树市| 德阳市| 宜阳县| 石泉县| 含山县| 资兴市| 太原市| 贵溪市| 揭西县| 体育| 苏尼特左旗| 芜湖县| 中江县| 惠州市| 云龙县| 罗平县| 酒泉市| 萨迦县| 通渭县| 怀宁县| 东至县| 厦门市| 眉山市| 八宿县| 昌宁县| 盐亭县| 息烽县| 石柱| 栾川县| 永靖县|