【不熟練】知識遷移能力-數(shù)組中只出現(xiàn)一次的數(shù)字

數(shù)組中只出現(xiàn)一次的數(shù)字

題目描述

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

//num1,num2分別為長度為1的數(shù)組懈息。傳出參數(shù)
//將num1[0],num2[0]設(shè)置為返回結(jié)果
public class Solution {
    /*解題思路:
   首先我們考慮這個問題的一個簡單版本:一個數(shù)組里除了一個數(shù)字之外肾档,其他的數(shù)字都出現(xiàn)了兩次黍瞧。請寫程序找出這個只出現(xiàn)一次的數(shù)字上忍。
   這個題目的突破口在哪里?題目為什么要強調(diào)有一個數(shù)字出現(xiàn)一次禽车,其他的出現(xiàn)兩次姑宽?我們想到了異或運算的性質(zhì):任何一個數(shù)字異或它自己都等于0遣耍。
   也就是說,如果我們從頭到尾依次異或數(shù)組中的每一個數(shù)字炮车,那么最終的結(jié)果剛好是那個只出現(xiàn)一次的數(shù)字舵变,因為那些出現(xiàn)兩次的數(shù)字全部在異或中抵消
   掉了。有了上面簡單問題的解決方案之后瘦穆,我們回到原始的問題纪隙。如果能夠把原數(shù)組分為兩個子數(shù)組。在每個子數(shù)組中难审,包含一個只出現(xiàn)一次的數(shù)字瘫拣,而
   其它數(shù)字都出現(xiàn)兩次。如果能夠這樣拆分原數(shù)組告喊,按照前面的辦法就是分別求出這兩個只出現(xiàn)一次的數(shù)字了麸拄。
   我們還是從頭到尾依次異或數(shù)組中的每一個數(shù)字,那么最終得到的結(jié)果就是兩個只出現(xiàn)一次的數(shù)字的異或結(jié)果黔姜。因為其它數(shù)字都出現(xiàn)了兩次拢切,在異或中全
   部抵消掉了。由于這兩個數(shù)字肯定不一樣秆吵,那么這個異或結(jié)果肯定不為0淮椰,也就是說在這個結(jié)果數(shù)字的二進制表示中至少就有一位為1。我們在結(jié)果數(shù)字中
   找到第一個為1的位的位置纳寂,記為第N位≈魉耄現(xiàn)在我們以第N位是不是1為標準把原數(shù)組中的數(shù)字分成兩個子數(shù)組,第一個子數(shù)組中每個數(shù)字的第N位都為1毙芜,
   而第二個子數(shù)組的每個數(shù)字的第N位都為0『雒剑現(xiàn)在我們已經(jīng)把原數(shù)組分成了兩個子數(shù)組,每個子數(shù)組都包含一個只出現(xiàn)一次的數(shù)字腋粥,而其它數(shù)字都出現(xiàn)了
   兩次晦雨。*/
    public void FindNumsAppearOnce(int [] array,int num1[], int num2[]) {
        if(array==null ||array.length<2)
            return ;
        int temp = 0;
        for(int i=0;i<array.length;i++)
            temp ^= array[i];//將array數(shù)組中的每一位按位逐一進行異或架曹,例如a=4'b1010,則b=1^0^1^0=0
        int indexOf1 = findFirstBitIs(temp);
        for(int i=0;i<array.length;i++){
            if(isBit(array[i], indexOf1))
                num1[0]^=array[i];
            else
                num2[0]^=array[i];
        }
    }
    //假設(shè)異或結(jié)果二進制表示中為1的位置為N
    public int findFirstBitIs(int num){
        int indexBit = 0;
        while(((num & 1)==0)&&(indexBit)<32){//num的二進制與1的二進制&操作
            num = num >> 1;//num右移一位
            ++indexBit;
        }
        return indexBit;//右移了幾位
    }
    //
    public boolean isBit(int num,int indexBit){
        num = num >> indexBit;
        return (num & 1) == 1;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末闹瞧,一起剝皮案震驚了整個濱河市绑雄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌奥邮,老刑警劉巖万牺,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異漠烧,居然都是意外死亡杏愤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門已脓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人通殃,你說我怎么就攤上這事度液。” “怎么了画舌?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵堕担,是天一觀的道長。 經(jīng)常有香客問我曲聂,道長霹购,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任朋腋,我火速辦了婚禮齐疙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘旭咽。我一直安慰自己贞奋,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布穷绵。 她就那樣靜靜地躺著轿塔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪仲墨。 梳的紋絲不亂的頭發(fā)上勾缭,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機與錄音目养,去河邊找鬼俩由。 笑死,一個胖子當(dāng)著我的面吹牛混稽,可吹牛的內(nèi)容都是我干的采驻。 我是一名探鬼主播审胚,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼礼旅!你這毒婦竟也來了膳叨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤痘系,失蹤者是張志新(化名)和其女友劉穎菲嘴,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體汰翠,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡龄坪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了复唤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片健田。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖佛纫,靈堂內(nèi)的尸體忽然破棺而出妓局,到底是詐尸還是另有隱情,我是刑警寧澤呈宇,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布好爬,位于F島的核電站,受9級特大地震影響甥啄,放射性物質(zhì)發(fā)生泄漏存炮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一蜈漓、第九天 我趴在偏房一處隱蔽的房頂上張望穆桂。 院中可真熱鬧,春花似錦迎变、人聲如沸充尉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽驼侠。三九已至,卻和暖如春谆吴,著一層夾襖步出監(jiān)牢的瞬間倒源,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工句狼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留笋熬,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓腻菇,卻偏偏與公主長得像胳螟,于是被迫代替她去往敵國和親昔馋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容