leetcode single number II

題目爲:給定一個數組,所有的數都出現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。
}



好難啊~~(||^ ^)


發佈了25 篇原創文章 · 獲贊 10 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章