在一個成對數(shù)組中找出單獨的數(shù)

一個整型數(shù)組里除了兩個數(shù)字之外,其他的數(shù)字都出現(xiàn)了兩次。請寫程序找出這兩個只出現(xiàn)一次的數(shù)字。

這道題呢在leetcode上見過,那道題是從1連續(xù)到n,中間缺了一個數(shù),讓你找出來缺的那個數(shù)是什么。這兩道題很相似,那道題就是用了疑惑,數(shù)組中的每個數(shù)和從1開始的i抑或,這樣剩下來的也就是單獨出現(xiàn)的i,也就是數(shù)組中缺少的那個元素。

講真,我看到這道題的時候完全沒有想到用異或,而且得知是兩個不一樣的元素的時候也不知道怎么樣去用異或。所以所算法,對于一般人來講,就是見過,用的熟練的問題,不求你會發(fā)明創(chuàng)造,只要用的好就可以了。

扯遠了,回到這道題上。這道題有兩個單獨出現(xiàn)的元素。如果使用異或走一遍這個數(shù)組的話得到的結果是非0的,也就是這兩個元素異或的結果。那么根據(jù)這個結果,怎么找出這兩個元素呢。

思考一下,兩個不一樣的元素的異或的結果肯定不是0。那么我們就找這個結果中有右往左第一個非0位,也就是1出現(xiàn)的第一次的位置。這兩個元素中肯定有一個在這個位置是0,另一個在這個位置是1。而其他成對出現(xiàn)的元素也會分為兩個部分,一個部分在個位置是1,另一個部分在這個位置是0.所以,我們就把一個數(shù)組求兩個單獨元素的問題就分割成,兩個數(shù)組每個數(shù)組求其單獨元素的問題。所以這個時候使用異或就很好解決了。
代碼如下:

class Solution {
public:
    void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
       if(data.size() <2)return;
        int hxor =0;
        int flag =1;
        for(int i=0;i<data.size();++i)
            hxor ^= data[i];
        while((hxor&flag)==0) flag <<= 1;
        *num1 = hxor;
        *num2 = hxor;
        for(int i=0;i<data.size();++i)
            {
            if(data[i] & flag)
                *num1 ^= data[i];
            else
                *num2 ^= data[i];
        }
    }
};
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,641評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,537評論 19 139
  • 國慶假期,媽媽帶我去青島動物園玩!我高興的不亦樂乎,前一天晚上,我折騰了好久才睡著。 我們走進動物園...
    祝福_e166閱讀 355評論 0 2
  • 夜風習習,我站在陽臺晾剛洗好的衣裳,一抬頭發(fā)現(xiàn)一輪清淺的彎月,就那樣斜斜的掛在邊上,仿佛離我很近,伸出手去卻又那么...
    如小玉閱讀 748評論 0 0
  • 世人都曉神仙好,惟有功名忘不了!古今將相在何方?荒冢一堆草沒了。 世人都曉神仙好,只有金銀忘不了!終朝只恨聚無多,...
    向內的旅程閱讀 345評論 0 2

友情鏈接更多精彩內容