無序數(shù)組的二分與異或運(yùn)算

1.無序數(shù)組的二分應(yīng)用

無序數(shù)組,相鄰不等,找出一個局部最小??捎枚?。
思路:

  • 首先判定兩端是不是比其相鄰的小,如果是直接返回局部最小的位置。
  • 否則,說明中間必定存在局部最小。選取兩者的middle,判斷middle是都是局部最小,如果是返回middle。
  • 否則,根據(jù)趨勢重復(fù)步驟二。

2.異或運(yùn)算

基本概念

異或:相同為0,不同為1。
同或:相同為1,不同為0。

異或的基本性質(zhì)

  • 0^N == N, N^N == 0
  • 異或運(yùn)算滿足交換律和結(jié)合律

運(yùn)用舉例

  • 1.不增加額外變量,互換兩個值,a = a^b;b = a^b;a = a^b
  • 2.一個數(shù)組中有一種數(shù)字出現(xiàn)了奇數(shù)次,其他數(shù)字都出現(xiàn)了偶數(shù)次,怎么找到并打印這個數(shù)。int result = a[0
    ]a[1]...a[n].
  • 3.怎么把一個int類型的數(shù)字N,提取出最右側(cè)的1來。N&((~N)+1)
  • 4.一個數(shù)組中有兩種數(shù)字出現(xiàn)了奇數(shù)次,其它數(shù)都出現(xiàn)了偶數(shù)次,怎么找到并打印這兩種數(shù)字。
    運(yùn)用結(jié)論3。
    (a) 首先將所有數(shù)字進(jìn)行異或,得出結(jié)果eor,這個結(jié)果等于這兩個數(shù)字異或的結(jié)果。
    (b) 接著將數(shù)組中的數(shù)字根據(jù)這個異或結(jié)果進(jìn)行分組,兩組中分別找出數(shù)字。具體操作為,(i)提取eor中最右側(cè)的1,rightone(ii)如果arr[i]&rightone!=0,滿足條件的進(jìn)行異或,最終得到結(jié)果onlyone(iii)另一個結(jié)果為eor^onlyone
  • 某個數(shù)字二進(jìn)制中1的個數(shù)。每次提取最右側(cè)的1,再將最右側(cè)的1給抹零,比如數(shù)字N的二進(jìn)制中1的個數(shù)
    int count = 0;
    while(N!=0){int right = N&((~N) +1);count++;N = N^right}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容