乙個整型陣列 nums 裡除兩個數字之外,其他數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是o(n),空間複雜度是o(1)。
一看題目發現要求空間複雜度為o(1),一下子就徹底蒙了,本來打算用傳統的方法建立乙個大陣列,裡面有多少就加1,發現完全不行,想了半天沒有想出來結果,於是借鑑了一下答案,發現了位運算是真的厲害;
聯想到了以前那道用位運算解八皇后的題:
取乙個二進位制數的最低位1的值:
如0110;取倒數第二位1;
可以用lowbit 即 a&(-a);
異或的操作:
0與任何值異或都為他本身;
兩個相同的數異或為0;
於是這道題的**便如下·,這裡假設兩個不相等的元素為a,b
······思路為首先算出來整個陣列所有值的異或值,相同的兩個值異或為0,最後的結果便為兩個不同的值的異或結果;
···接著分組,將a與b分為不同的組,根據a^b的結果中任意取乙個1值,這裡取最低位,這裡a的此位與b的此位一定是相反的,同時陣列中的其他元素也可以根據這個來分組,若此位為1為一組,不為1的為一組,然後異或便得到了所需要的ab值;
**:
class
solution
int lowbit = cur&
(-cur)
;for
(int i =
0; i < nums.length; i ++
)else
}return out;
}}
面試題56 I 陣列中數字出現的次數
面試題56 i.陣列中數字出現的次數 難度中等92收藏分享切換為英文關注反饋 乙個整型陣列nums裡除兩個數字之外,其他數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是o n 空間複雜度是o 1 示例 1 輸入 nums 4,1,4,6 輸出 1,6 或 6,1 示例 2 輸入...
面試題56 I 陣列中數字出現的次數
乙個陣列,有兩個數字只出現一次,其他數字出現兩次,如何在o n 的複雜度,o 1 的空間複雜度情況下求出這兩個數字?這個題之前做校賽的時候做過,還是很簡單,由異或的性質,我們很容易得知道,把所有數字都異或一次,答案就是res a b 那倆單獨的數字的異或 那麼怎麼利用好這個res呢?由於本題不能開陣...
面試題56 I 陣列中數字出現的次數
乙個整型陣列 nums 裡除兩個數字之外,其他數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是o n 空間複雜度是o 1 示例 1 輸入 nums 4,1,4,6 輸出 1,6 或 6,1 示例 2 輸入 nums 1,2,10,4,1,4,3,3 輸出 2,10 或 10,2...