一、
在乙個陣列 nums 中除乙個數字只出現一次之外,其他數字都出現了三次。請找出那個只出現一次的數字。
示例 1:
輸入:nums = [3,4,3,3]
輸出:4
示例 2:
輸入:nums = [9,1,7,9,7,9,7]
輸出:1
限制:1 <= nums.length <= 10000
1 <= nums[i] < 2^31
通過次數19,289提交次數24,348
思路:
位運算,將每個數字看作二進位制,對於每乙個位置來說,1和0出現的次數如果除開只出現一次的數字,都會是3的倍數,那麼對最後的結果來說,就是每個位置的1的數量mod 3,如果結果為0,則說明只出現一次的數字在這個位置為0,如果結果為1,則表示為1。
更進一步的,如果採用二進位制來表示出現的次數,則可以表示為,00,01,10。將這個分為兩位分別看待,可以畫出狀態轉換圖,借用題解區大佬的圖。
來自leecode題解區: 作者 krahets
對於two來說可以寫出狀態轉換的**:
if
(two ==0)
:if(n ==0)
: one = one
if(n ==1)
: one =
~one
if(two ==1)
: one =
0
歸納可得出two的位運算**為:
//這裡的first指的是從右往左的第乙個位置
//而two代表的是這個位置二進位製所代表的的十進位制的值
first = first^num&
~second;
同理可更新出one。完整**如下:需要注意,在更新完first之後,上面的狀態轉換圖會發生變化,導致對second的更新**會和first變成一樣的。
class
solution
//ones = ones ^ num & ~twos
//twos = twos ^ num & ~ones
return first;}}
;
二、
乙個整型陣列 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]
限制:2 <= nums.length <= 10000
通過次數37,528提交次數52,194
位運算,分組
容易想到的是,如果只有乙個只出現一次的數字,整個數字求異或即可。那麼求解兩個數字的題目,考慮能否通過某種方式將兩個數字分別分到兩組中,然後分別求異或即可。方法就是具體考慮所有數字的某一位,對陣列所有數字求異或,結果一定是兩個只出現一次的數字在該位求異或的結果,如果結果為1,則說明在這一位兩個數字不相等,那麼就可以以這一位為依據,將這一位為0的和這一位為1的分成兩組,根據上面的推導已經確定兩個數在這一位不等,即乙個為1乙個為0,那麼就自然被分到了兩組,異或求解即可。
class
solution
int bit =0;
for(
int i =
0;i<
32;i++)}
for(
auto num:nums)
else
}return ret;}}
;
劍指offer 56 陣列中只出現一次的數字
乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次,找出這兩個數。先放乙個簡單的dict統計頻率的python from collections import counter class solution 返回 a,b 其中ab是出現一次的兩個數字 def self,array b counte...
《劍指Offer》56 陣列中只出現一次的數字
牛客網 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次,找出這兩個數。兩個不相等的元素在位級表示上必定至少會有一位存在不同。將陣列的所有元素異或得到的結果為不存在重複的兩個元素異或的結果。diff diff 得到出 diff 最右側不為 0 的位,也就是不存在重複的兩個元素在位級表示上最右側...
劍指Offer56 陣列中數字出現的次數
題目一 陣列中數字只出現一次的兩個數字。乙個整形陣列裡除兩個數字之外,其它數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度為o n 空間複雜度是o 1 解題思路 位運算中異或運算的性質 兩個相同數字等於0,乙個數和零異或還是它本身。當只有乙個數出現一次時,我們把陣列中所有的數依次...