LeetCode137 只出現一次的數字 II

2021-10-09 04:41:32 字數 1636 閱讀 7142

給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現了三次。找出那個只出現了一次的元素。

說明:你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?

輸入: [2,2,3,2]

輸出: 3

方法一:hashset

將陣列裡面的數全加入到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實現的...