題目描述
乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。
先考慮只有只有乙個數字出現一次的情況,因為其他數字只出現了兩次,所以對這兩個數字進行異或運算的時候,其結果是0,那麼那個只出現一次的數字進行異或運算的時候,其結果必然不是0,所以可以利用這點找出那個只出現一次的數字。現在考慮有兩個數字出現一次的情況,仍然借鑑上面的思路,因為只出現一次的那個數字的異或結果不是0,遍歷整個陣列進行異或運算的結果也肯定不是0,現在可以對該數右邊第乙個是1的位的位置作為標準(記為n),將整個陣列進行拆分,這樣會得到兩組陣列,一組n位的位置的值都是1,兩組則都是0。用乙個簡單的例子就可以說明這點:乙個陣列,遍歷進行異或運算的結果是0110,右邊第乙個不是0的位的位置的2,那麼陣列和。第乙個陣列的右數第2位的值都是0,而第二個陣列右數第2位的值都是0。所以在對第一組進行異或運算的結果是1,第二個陣列進行異或運算的結果是4,因為其他都出現了兩次,異或運算之後變成了0。
根據上述思路,實現的**如下(已被牛客ac):
package com.rhwayfun.offer;
public
public
void
if(array == null || array.length < 2) return;
int resultexclusiveor = 0;
for (int i = 0; i < array.length; i++)
//找到右邊第乙個是1的位的位置
int rightfirstindexis1 = findfirstindexis1(resultexclusiveor);
//把該位是1的與不是1的數分別兩部分
for (int i = 0; i < array.length; i++) else}}
//數num右數index為是否為1
private boolean isbit1(int num, int index)
//找到右邊第乙個是1位的位置
private
intfindfirstindexis1(int resultexclusiveor)
return index;
}public
static
void
main(string args) ;
int num1 = new
int;
int num2 = new
int;
system.out.println(num1[0] + "," + num2[0]);
}}
劍指Offer 三十九 平衡二叉樹
解法1 在遍歷樹的每個結點的時候,呼叫函式depth得到它的左右子樹的深度。如果每個結點的左右子樹的深度相差都不超過1,則這是一顆平衡的二叉樹。這種方法的缺點是,首先判斷根結點是不是平衡的,需要使用depth獲得左右子樹的深度,然後還需要繼續判斷子樹是不是平衡的,還是需要使用treedepth獲得子...
劍指offer 陣列
資料是最簡單的資料結構,它佔據一塊連續的記憶體並按照順序儲存資料。建立陣列時,首先指點陣列的容量大小,然後根據大小分配記憶體。缺點 空間效率不高。經常有空閒的區域滅有得到充分利用。優點 時間效率很高。可以根據時間效率高的特點,來實現簡單的雜湊表 把陣列的下標設為雜湊表的鍵值,陣列中的每乙個數字設為雜...
劍指offer 陣列
public class 03 陣列中的重複數字 swap number,number i i return 1 交換 public void swap int number,int i,int j public class 03 陣列中的重複數字 return 1 public intfindre...