Leetcode--260. 只出现一次的数字Ⅲ
給定一個整數數組?nums,其中恰好有兩個元素只出現一次,其余所有元素均出現兩次。 找出只出現一次的那兩個元素。
示例 :
輸入: [1,2,1,3,2,5]
輸出: [3,5]
注意:
結果輸出的順序并不重要,對于上面的例子,?[5, 3]?也是正確答案。
你的算法應該具有線性時間復雜度。你能否僅使用常數空間復雜度來實現?
思路:
1.對所有數字異或,一樣的數字抵消,出現一次的兩個數字異或運算后必定不為0;
a^0=a, a^a=0,所以對整個數組進行異或運算剩下的應該是只出現了一次的兩個數的異或結果a
2.這個數字和相反數做與運算得到一個二進制位最右邊一位為1的數字;
兩個不同的數,其異或結果于二進制的表達上,任意一個值為一的比特位便表示了兩個數的不同(如果a、b兩個值不相同,則異或結果為1。如果a、b兩個值相同,異或結果為0)。
所以我們找到a最低位為1的值,這是他們兩個數不同的地方? ?
?a &=(~a)+1;可以完成這個操作
?
3.a和數組的每個數字做與運算,等于0的分為一組,等于a的分為一組,同時也將兩個不一樣的數字分開;
兩個數分在了不同的組,之后分別異或,各組中除了他倆,其他的都出現了兩次,所以各組最后的異或結果就是他倆的值
4.完成。
class Solution {
? ? public int[] singleNumber(int[] nums) {
? ? ? ? int n = nums.length;
? ? ? ? int a=0,i;
? ? ? ? for(i=0;i<n;i++)
? ? ? ? {
? ? ? ? ? ? a = (a^nums[i]);
? ? ? ? }
? ? ? ? a &=(~a)+1;
? ? ? ? int[] b = new int[2];
? ? ? ? for(i=0;i<n;i++)
? ? ? ? {
? ? ? ? ? ? if((a&nums[i])==0)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? b[0] = (b[0]^nums[i]);
? ? ? ? ? ? }
? ? ? ? ? ? else
? ? ? ? ? ? {
? ? ? ? ? ? ? ? b[1] = (b[1]^nums[i]);
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return b;
? ? }
}
總結
以上是生活随笔為你收集整理的Leetcode--260. 只出现一次的数字Ⅲ的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Leetcode--150. 逆波兰表达
- 下一篇: 【剑指offer】面试题04:二维数组中