【題目】
乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。
【思路】
首先:位運算中異或的性質:兩個相同數字異或=0,乙個數和0異或還是它本身。
當只有乙個數出現一次時,我們把陣列中所有的數,依次異或運算,最後剩下的就是落單的數,因為成對兒出現的都抵消了。
依照這個思路,我們來看兩個數(我們假設是ab)出現一次的陣列。我們首先還是先異或,剩下的數字肯定是a、b異或的結果,這個結果的二進位制中的1,表現的是a和b的不同的位。我們就取第乙個1所在的位數,假設是第3位,接著把原陣列分成兩組,分組標準是第3位是否為1。如此,相同的數肯定在乙個組,因為相同數字所有位都相同,而不同的數,肯定不在一組。然後把這兩個組按照最開始的思路,依次異或,剩餘的兩個結果就是這兩個只出現一次的數字。
【**】
public
static
void
main(string args) ,n1,n2);
system.out.println(n1[0]);//3
system.out.println(n2[0]);//4
} //陣列中只出現一次的數
public
static
void
int len=arr.length;
if(len==2)
int bitres=0;
for(int i=0;iint index=findfirst1(bitres);
for(int i=0;iif(isbit1(arr[i],index))else} }
//根據index位是否為1,把陣列分成2組
private
static
boolean
isbit1(int target, int index)
//找到ab異或結果中的第乙個1所在的位數
private
static
intfindfirst1(int bitres)
return index;
}//時間複雜度o(n^2)
//當前數字不在list中則插入,否則從list刪除(出現兩次的數字)
//這樣結束遍歷後set中剩餘的就是要找的那兩個只出現了一次的數字。
public
static
void
arraylistlist=new arraylist();
for(int i=0;iif(list.contains(arr[i]))else
}num1[0]=list.get(0);
num2[0]=list.get(1);
}
陣列中只出現一次的數
首先看看題目要求 陣列 a中,除了某乙個數字 x之外,其他數字都出現了三次,而 x出現了一次。請給出最快的方法找到x。這個題目非常有意思,在本人部落格中有 位操作基礎篇之位操作全面總結 這篇文章介紹了使用位操作的異或來解決 陣列中其他數字出現二次,而x出現一次,找出x。有 這邊文章介紹了分組異或的方...
陣列中只出現一次的數
題目1 乙個陣列中,除了某乙個只出現過一次的數字外,其餘數字均出現過2次,找出這個只出現了一次的數字。思路 分析題幹,發現強調了陣列中數字出現的次數為1和2,則可以想到異或運算,兩個相同的數字異或結果為0,相同的數異或的結果為其本身,且異或運算存在交換律和結合律,即a b a b,b a a b。那...
陣列中只出現一次的數
問題一 在乙個整數陣列中,除了乙個數之外,其他的數出現的次數都是兩次,求出現一次的數,要求時間複雜度盡可能的小。例如陣列,出現一次的數是1.從題目的描述可以看出,陣列中只有乙個數字出現了一次,其他的數字都出現兩次,聯想到異或運算的特點 任何乙個數字和自己做異或運算的結果都是0,任何數字和0運算的結果...