乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。
/**
*@author calvin 2023年5月20日上午10:31:08
* 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。
*///num1,num2分別為長度為1的陣列。傳出引數
//將num1[0],num2[0]設定為返回結果
/** * 首先:位運算中異或的性質:兩個相同數字異或=0,乙個數和0異或還是它本身。
* 當只有乙個數出現一次時,我們把陣列中所有的數,
* 依次異或運算,最後剩下的就是落單的數,因為成對兒出現的都抵消了
* 。 依照這個思路,我們來看兩個數(我們假設是ab)出現一次的陣列。
* 我們首先還是先異或,剩下的數字肯定是a、b異或的結果,這個結果的二進位制中的1,
* 表現的是a和b的不同的位。我們就取第乙個1所在的位數,
* 假設是第3位,接著把原陣列分成兩組,分組標準是第3位是否為1。
* 如此,相同的數肯定在乙個組,因為相同數字所有位都相同,而不同的數
* 肯定不在一組。然後把這兩個組按照最開始的思路,依次異或,
* 剩餘的兩個結果就是這兩個只出現一次的數字。
* *
* 異或滿足交換律和結合律
* * */
public
class
solution else
//得到第乙個出現的1,因為相同為0,不同為1
//所以這就是2個數字的乙個不同的地方,用這個來區分2個數字
int index = findfirst1(res);
for(int i = 0 ; i < length; ++i)else}}
} private
boolean
isbit1(int target, int index)
private
intfindfirst1(int bitresult)
return index;
} /**
以下為牛客id 高琥所寫
*//** * 陣列中有兩個出現一次的數字,其他數字都出現兩次,找出這兩個數字
*@param array
*@param num1
*@param num2
*/public
static
void
if(array == null || array.length <= 1)
int len = array.length, index = 0, sum = 0;
for(int i = 0; i < len; i++)
for(index = 0; index < 32; index++)
for(int i = 0; i < len; i++)else
}}/**
* 陣列a中只有乙個數出現一次,其他數都出現了2次,找出這個數字
*@param a
*@return
*/public
static
intfind1from2(int a)
return res;
}/**
* 陣列a中只有乙個數出現一次,其他數字都出現了3次,找出這個數字
*@param a
*@return
*/public
static
intfind1from3(int a)
}int res = 0;
for(int i = 0; i < 32; i++)
}return res;
}}
劍指offer 陣列中只出現一次的數字
1 乙個數字出現一次,其他數字出現兩次 兩個相同的數異或為0,所以將陣列裡的所有數依次異或,得到的結果就是只出現一次的數。include using namespace std int main int num 0 for int i 0 i 7 i cout 2 乙個數字出現一次,其他數字出現n次...
劍指offer 陣列中只出現一次的數字
乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。解法 首先考慮如果陣列中只有乙個數字出現一次,其他的數字都出現兩次,怎麼找出這個只出現一次的數字?這裡需要用到異或運算的性質 乙個數字 不管是什麼形式的數字,只要其二進位制形式確定 和其自身的異或運算的結果一...
《劍指offer》 陣列中只出現一次的數字
乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。解法 1.了解幾個常識 a.了解兩個相同的數字異或結果為0 b.任何數字與0進行異或結果為數字本身 c.任何數字與1相與,只有最低位 右邊 為1時候,才等於1 2.一種對陣列分成兩組的方法,比如2 10 和3...