查詢 56題 陣列中數字出現的次數II

2021-10-16 13:13:18 字數 1520 閱讀 3373

在乙個陣列 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...