leetcode137 只出現一次的數字詳解

2021-09-12 13:00:01 字數 1109 閱讀 1907

原題連線:

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

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

示例 1:

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

輸出: 3

示例 2:

輸入: [0,1,0,1,0,1,99]

輸出: 99

3、函式f實現的功能其實也很簡單,就是乙個計數器的功能,如果出現一次1則加1,如果1的個數等於3則從0開始重新計數。那麼為什麼要這麼做呢?因為按照題設,除了某個元素外所有的元素都會出現三次,那如果最後計數器的值是0就表明第k位為1的元素都出現了3次,所以這個特殊的元素的第k位就是0,即output[k]的值等於0,相反output[k]的值就是1。如果我們知道了output每一位的值,我們也就得到了最終的結果啦。

上面提到的計數器實際上並不準確。因為計數器的值是從00—01—11—10—00,而我們的需求是當1的個數等於3時從0開始重新計數我們需要的狀態改變是00—01—10—00(也可以是00—01—11—00或者其他的,只是用來區分三個狀態)。因為狀態有三種,所以我們需要2bits來表示,設低位為low,高位為high。接下來分別為low和high編寫狀態轉換方程。

狀態方程的編寫沒有什麼統一的模板,就是找規律啦,對於這道題來說,low是每有乙個1則改變一次狀態,但是!!!當high==1時是特例!所以low的方程如下

low = (low^x[k])&(~high);

(其中異或操作用來改變狀態,~high用來應對特例)

high的狀態方程也差不多,相信你也可以動動手寫出來了。這裡就直接貼出來了(注意:這個high要寫在low的後面)

high = (high^x[k])&(~low);

到這裡我們也差不多搞定這道題了,因為output的每一位執行的操作都是一樣的,所以我們可以很直接的將low和high都擴充套件到32位。因此最終的**如下:

int singlenumber(vector& nums) 

return low;

}

Leetcode137 只出現一次的數字

題目描述 給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現了三次。找出那個只出現了一次的元素。說明 你的演算法應該具有線性時間複雜度。你可以不使用額外空間來實現嗎?示例 1 輸入 2,2,3,2 輸出 3 示例 2 輸入 0,1,0,1,0,1,99 輸出 99 思路 對數字中數...

leetcode 137 只出現一次的數字 II

給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現了三次。找出那個只出現了一次的元素。說明 你的演算法應該具有線性時間複雜度。你可以不使用額外空間來實現嗎?這種純數字計算的問題,如果我們只用加減乘除就能做出來,那leetcode就太low了,這種問題,應該深入到位級別運算。思考,將...

leetcode137 只出現一次的數字2

給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現了三次。找出那個只出現了一次的元素。說明 你的演算法應該具有線性時間複雜度。你可以不使用額外空間來實現嗎?示例 1 輸入 2 2,3 2 輸出 3示例 2 輸入 0 1,0 1,0 1,99 輸出 99以例項1進行講解,2,2,3,...