標籤:leetcode 演算法 面試
【題目】
Given an array of integers, every element appears three times except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
【題意】
給定一個整數以外,其中除了一個整數只出現一次以外,其他都整數都出現3次,找出那個出現一次的數
要求線性複雜度,不適用額外的空間?
【思路】
類比三進位運算
three, two, one 分別表示當前是否已經出現了3個1, 2個1, 1個1
0 0 0 表示沒有出現1
0 0 1 表示出現了1個1
0 1 0 表示出現了2個1
0 1 1 表示出現了3個1,這時我們需要把它轉化成
1 0 0 也就是3進位計算的結果,我們得到three=1,然後把two和one清0
各位的迭代關係如下:
two = (one & A[i]) | two 已經出現了一個1,這次又出現了一個1 或者 這次出現的不是1,但是本來就已經有兩個1了
one = one ^ A[i] 如果本來就有一個1了,這次又出現一個1,那麼這我們需要向two進一位(也就是上一步,將two設成1),這是我們需要將one清為0
three = two & one 如果已經出現了3個1,則three為1,此時需要將two和one清0
【代碼】
class Solution {public: int singleNumber(int A[], int n) { int one=0; int two=0; int three=0; for(int i=0; i<n; i++){ two= (one & A[i]) | two; one= one ^ A[i]; three = one & two; // three=1表示1已經出現了3此,two和one需要清空 two &= ~three; one &= ~three; } return one; }};