1. 程式人生 > >leetcode中Single Number II的一個通用解法

leetcode中Single Number II的一個通用解法

Single Number II

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?

除了一個元素外,其它元素都是出現三次,要你把只出現一次的那個元素找出來。

我看了其他部落格的解法,感覺講得不夠簡潔易懂。其實這個題目跟數電中設計邏輯電路的過程是一樣的。

我們把整形int視作32位的二進位制的01變數,因為其他元素都出現三次,我們可用一位二進位制變數Ones,記錄接收1的次數模3是否等於1,用一位二進位制變數Twos,記錄接收1的次數模3是否等於2。為了方便理解,我們把Twos放在高位(記作A),Ones放在低位(記作B)。於是有這樣的一個狀態轉移表

A(Twos) B(Ones) C(Input) D(Next_Twos) E(Next_Ones)
0 0 1 0 1
0 1 1 1 0
1 0 1 0 0
示意圖是這樣的



然後就可以非常容易地用程式碼實現了,不管其他元素和特殊元素出現的次數是多少,都可以用這個方法做。比如說,特殊元素出現兩次,我們可以直接return twos。如果其他元素都出現四次、五次,我們無非就是多畫幾個狀態轉移表,求出表示式而已。這個方法非常簡單粗暴,我覺得挺好的,特地寫篇blog記錄一下。
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ones=0,twos=0;
		int tmp_ones, tmp_twos;
		int j;
		for(j=0;j<nums.size();j++){
			tmp_twos = ~twos&ones&nums[j]|(twos&(~ones)&~nums[j]);
			tmp_ones = (~twos)&(~ones)&nums[j]|((~twos)&ones&(~nums[j]));
			ones = tmp_ones;
			twos = tmp_twos;
			
		}
		return ones;
    }
};