137. Single Number II
每個數字都出現 3 次,只有一個數字出現 1 次。
我們要找出這個只出現一次的數字。
2.解題思路:位元統計法(Bit Counting)
每個整數都是 32-bit(二進位),我們針對這 32 個 bit 中的每一位,統計這一位上 1 出現的總次數。
因為所有其他數字都是出現 3 次,只有一個數字出現 1 次。
所以,如果你把所有數字在某個 bit 上的值加起來,然後對 3 取餘數,剩下的就是只出現一次的那個數字的 bit 值。
3.解釋步驟:
1.外層迴圈跑 32 次,因為整數是 32 bit。
2.對於每一個 bit(從第 0 位到第 31 位):
用 bit = 1 << i 把第 i 個位元拿出來。
在整個 nums 陣列中統計有多少數字這一位是 1。
3.如果某一位的總和 % 3 != 0,那麼這一位在那個「只出現一次的數字」中是 1。
4.最後把這些位元組合起來,就是答案。
特別注意:負數也會正確處理
因為 Java 使用 二補數(two's complement) 表示負數,這個演算法自然會處理負數的符號位(第 31 位),不需要額外處理。
4.範例說明:
題目:找出只出現一次的數
輸入:nums = [2, 2, 3, 2]
Step 1:轉換成二進位
我們只看後5個位元(因為數字不大):
Decimal Binary (5 bits)
2 00010
2 00010
3 00011
2 00010
出現次數: 0 0 0 4 1
對 3 取餘: 0 0 0 1 1
結果二進位: 00011
十進位值: 3
最終結果:3(這就是只出現一次的那個數)
圖解總結
對每一個位元做:
統計所有數字在該位上的 1 的次數
對 3 取餘(因為其他數字都出現 3 次)
組合成只出現一次的數字
5.程式碼截圖:
6.學習心得:今天選的題目相對難比較多,因為這類型的題目我之前上課沒有做過,但在AI的協助下,讓我對這類型的題目更加熟悉,當然我這次也是請AI提示我,而不是馬上就給我答案,當然這樣的練習可以讓我自己去思考看看題目的解題方向是什麼。