題目:
解答:
方法一:雜湊
1方法二:異或class
solution
12 };
異或想到這個系列的第乙個題,就是找出單個的只出現一次的字元。做法是異或操作。這個題也是用異或。
把所有的數字進行一次異或,得到的是只出現了一次的兩個數字的異或。
這兩個數字不等,因此他們的二進位制必定至少1位不同,即異或結果中為1的那位(乙個數字的該位為1,另個數字的該位為0)。找出從右向左的第乙個不同的位置(異或值為1的位置),給mask在該位置設定成1,mask的其餘位置是0. mask存在的意義在於我們能通過該位置來分辨出兩個只出現了一次的數字。
然後技巧性的來了:再進行一次異或操作。
每個數字都跟mask相與。通過與的結果為0和為1,即可區分出兩個數字。
我剛開始有點不明白的是,為什麼把所有的元素都重新異或了?其實,因為除了這兩個元素以外,其他的元素都出現了兩次,這兩次相同的數字的和mask的與操作的結果是相同的,所以會被異或兩次抵消掉。
一言以蔽之,先通過異或找出兩個元素的異或結果。再根據異或結果的出現為1的位置作為mask,mask的二進位制只有1位是1,也就是只看兩個元素的該位置。最後,通過與操作判斷該位置是0還是1區分兩個元素。
1class
solution
1011
int a = 0, b = 0;12
int mask = 1;13
while ((mask & res) == 0
) 14
17for (int
n : nums)
1824
return;25
}26 };
面試題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 一看題目發現要求空間複雜度為o 1 一下子就徹底蒙了,本來打算用傳統的方法建立乙個大陣列,裡面有多少就加1,發現完全不行,想了半天沒有想出來結果,於是借鑑了...