在乙個陣列 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
如下圖所示,考慮數字的二進位制形式,對於出現三次的數字,各 二進位制位 出現的次數都是 3 的倍數。
因此,統計所有數字的各二進位制位中 1 的出現次數,並對 3 求餘,結果則為只出現一次的數字。
使用與運算,可獲取二進位制數字num的最右一位n
1n_1
n1:n1=
num&
in_1 =num \& i
n1=nu
m&i
配合無符號右移操作,可獲取num所有位的值(即n1−
n32n_1 - n_
n1−n3
2):num = num >>> 1
建立乙個長度為32的陣列counts,通過以上方法可記錄所有數字的各二進位制位的1的出現次數。
int
counts =
newint[32
];for(
int i =
0;i <
32;i++
)}
將counts各元素對3求餘,則結果為「只出現一次的數字」的各二進位制位。
for
(int i =
0;i <
32;i++
)
利用左移操作和或運算,可將counts陣列中各二進位制的值恢復到數字res上(迴圈區間i∈[
0,31]
i \in [0,31]
i∈[0,3
1])。
for
(int i =
0;i < counts.length;i++
)
最終返回res即可。
class
solution
}for
(int i =
0;i < counts.length;i++
)int res =0;
for(
int i =
0;i < counts.length;i++
)return res;
}}
複雜度分析: 56 陣列中數字出現的次數
1 當陣列中別的數都出現兩次,只有乙個數隻出現了一次,找出這個數 由於異或本身會是0,所以用0依次異或陣列中的每個數,最後會變成單獨的那個數 int xor 0 for int i 0 ixor array i 最後xor即單獨的這個數的數值 2 陣列中別的數字都出現了兩次,有兩個數字只出現了一次 ...
56 陣列中數字出現的次數
1 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。2 在乙個陣列中除了乙個數字只出現一次之外,其他數字都出現了三次。請找出那個只出現一次的數字。第1題 從頭到尾依次異或陣列中的每個數字,那麼最終的結果就是兩個只出現一次的數字的異或結果,因為其他數字都出現...
劍指offer 56題 陣列中數字出現的次數2
在乙個陣列 nums 中除乙個數字只出現一次之外,其他數字都出現了三次。請找出那個只出現一次的數字。示例 1 輸入 nums 3,4,3,3 輸出 4 示例 2 輸入 nums 9,1,7,9,7,9,7 輸出 1 利用位運算,當乙個陣列 現的其他數字都為3次時,所有數字的每一位加起來的各自的值對3...