給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現了三次。找出那個只出現了一次的元素。
說明:你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?
輸入: [2,2,3,2]方法一:hashset輸出: 3
將陣列裡面的數全加入到set中,把陣列裡面的數全加起來求和得sum,set裡面的數加起來求和得setsum,目標 = (setsum-sum)/2
注意:因為sum和setsum可能會超出int型別的上限,所以統一用long型別
class
solution
for(long s : set) sumset += s;
return
(int)(
(3* sumset - sumarray)/2
);}}
方法二:hashmap
class
solution
int res =0;
for(
int i =
0; i < len ;
++i)
}return res;
}}
方法三:位運算
考慮數字的二進位制形式,對於出現三次的數字,各 二進位制位 出現的次數都是 3 的倍數。
因此,統計所有數字的各二進位制位中 1 的出現次數,並對 3 求餘,結果則為只出現一次的數字。
因為每個數字出現的次數是3或1,所以說,使用兩個bit就可以說明每個位上的狀態變化。
單看某一位的變化就是如同上圖所示,用one和two表示低位和高位,則根據輸入的二進位制n可以推出one和two的計算方式。
if two ==0:
if n ==0:
one = one
if n ==1:
one =
~one
if two ==1:
one =
0
引入異或運算之後
if two ==0:
one = one ^ n
if two ==1:
one =
0
引入與運算以後
one = one ^ n &
~two
之後在新的one的基礎上,可以推出two的運算方式
two = two ^ n &
~one
所以用兩個int型別的數就可以表示每個位上的狀態變化,ones表示低位的變化,twos表示高位的變化。**如下
class
solution
return ones;
}}
Leetcode137 只出現一次的數字
題目描述 給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現了三次。找出那個只出現了一次的元素。說明 你的演算法應該具有線性時間複雜度。你可以不使用額外空間來實現嗎?示例 1 輸入 2,2,3,2 輸出 3 示例 2 輸入 0,1,0,1,0,1,99 輸出 99 思路 對數字中數...
leetcode 137 只出現一次的數字 II
給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現了三次。找出那個只出現了一次的元素。說明 你的演算法應該具有線性時間複雜度。你可以不使用額外空間來實現嗎?這種純數字計算的問題,如果我們只用加減乘除就能做出來,那leetcode就太low了,這種問題,應該深入到位級別運算。思考,將...
leetcode137 只出現一次的數字詳解
原題連線 給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現了三次。找出那個只出現了一次的元素。說明 你的演算法應該具有線性時間複雜度。你可以不使用額外空間來實現嗎?示例 1 輸入 2,2,3,2 輸出 3 示例 2 輸入 0,1,0,1,0,1,99 輸出 99 3 函式f實現的...