題目爲:給定一個數組,所有的數都出現3次,只有一個數出現一次
有兩種用位運算的解法,我嘗試去理解它們,用一個不是很懂位運算的人的思路。如果有錯誤的地方,還望指教~~
第一種:
//one two three分別是,如果這位(bit)出現了對應次數,則置爲1。以三爲週期循環,如果一個位出現了三次,則置0
int one=two=three=0;
for(int i=0;i<nums.size();i++)
{
two|=one&nums[i];//出現兩次的位=原來出現過兩次的位+(原來出現了一次,新的數也出現了一次)的位
one^=nums[i];//異或運算就記錄只出現過一次的位,因爲相同爲0,相異爲1
three=one&two;//出現三次的位=出現兩次的位 & 出現一次的位
one&=~three;//如果一個位出現了三次,那麼應該把出現一次的位置爲0,是清零的意思
two&=~three;//如果一個位出現了三次,那麼應該把出現二次的位置爲0
}
第二種:
//one two 分別表示,如果這位(bit)出現了對應的次數,則置爲1 int one=two=0; for(int i=0;i<nums.size();i++) { one=(one^nums[i])&~two; //one^nums[i] 如果對應位爲0,說明這個位要麼出現過兩次,要麼沒出現過。如果爲1,說明出現了一次。如果一個位既出現了一次,又出現了兩次,則應該置爲0
two=(two^nums[i])&~one;
//two^nums[i] 如果對應位爲0,說明這個位要麼出現過三次(two中兩次,nums[i]中一次),要麼沒出現過。如果爲1,說明出現了兩次/一次(nums[i])。
//如果爲1的位表示只出現過一次,那麼one裏面該位肯定也爲1,該位應該置爲0。如果該位在nums[i]中出現了一次,one對應位爲0,說明該位出現了兩次。
//如果一個位出現過兩次,又出現了一次,則應該置爲0。
}
好難啊~~(||^ ^)