問題描述:乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。
思路:1.遍歷陣列,利用乙個輔助陣列,如果陣列內沒有當前值則加入到陣列中,如果有則從陣列中刪掉,剩餘的兩個數即為只出現一次的數。
2.利用hashmap,key存放數字,value存放個數,找到value為1的兩個數。
3.位運算。
我們先考慮上述問題的簡單版本: 乙個陣列裡面只有乙個數字出現一次,其他都出現兩次,請找出這個數字。
這個問題可以可以使用用異或的性質解決。異或的性質:對於整數a,有
(1) a^a=0
(2)a^0=a
(2)a^b^c=a^(b^c)=(a^c)^b
利用以上的性質,上面的題目的解法為:
int result = 0;
for (int i = 0; i < arr.length; i++)
system.out.println(result);
(1)對於出現兩次的元素,使用「異或」操作後結果肯定為0,那麼我們就可以遍歷一遍陣列,對所有元素使用異或操作,那麼得到的結果就是兩個出現一次的元素的異或結果。
(2)因為這兩個元素不相等,所以異或的結果肯定不是0,也就是可以再異或的結果中找到1位不為0的位,例如異或結果的最後一位不為0。
(3)這樣根據異或的結果1所在的最低位分為兩組,一組該位全為1,另一組該位全為0。
(4)再次遍歷原陣列,該位置為0的一起異或,為1的一起異或,兩組異或的結果分別對應著兩個結果。複雜度o(n)。
//num1,num2分別為長度為1的陣列。傳出引數
//將num1[0],num2[0]設定為返回結果
public class solution
int len = array.length, index = 0, sum = 0;
for(int i = 0; i < len; i++)
for(; index < 32; index++)
}for(int i = 0; i < len; i++)else}}
}
劍指offer 40 陣列中只出現一次的字元
乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次,請寫出程式找出這兩個只出現了一次的數字,要求時間複雜度為o n 空間複雜度為o 1 此時出了迴圈,tty為兩個只出現一次的數的異或值 現在需要確定tty的最低位1在哪個bit位 int index 0 int num1 0 int num2 0...
劍指offer40陣列中只出現一次的數字
乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。解題思路 將陣列分成兩個陣列,每個陣列中包含乙個只出現一次的數字,其他都為出現兩次的數字。由於這兩個只出現一次的數字不相同,所以可以根據整個陣列異或的結果和1進行與操作,作為分割兩個陣列的位置。分割為兩個陣列...
劍指offer 40陣列中只出現一次的數字
題目描述 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了偶數次。請寫程式找出這兩個只出現一次的數字。分析 1.因為有2個數字只出現了一次,而其他的數字都是2次,通過異或運算,最後可以得到這2個只出現一次的數字的異或結果值,這個值必然不為0。2.然後找出這個數字二進位制中,最低位為1的位數,必然這...