LeetCode 只出現一次的數字III

hestyle發表於2019-02-23

給定一個整數陣列 nums,其中恰好有兩個元素只出現一次,其餘所有元素均出現兩次。 找出只出現一次的那兩個元素。
示例 :

輸入: [1,2,1,3,2,5]
輸出: [3,5]

注意:

結果輸出的順序並不重要,對於上面的例子, [5, 3] 也是正確答案。
你的演算法應該具有線性時間複雜度。你能否僅使用常數空間複雜度來實現?

請先翻閱 LeetCode 只出現一次的數字
此題就是nums中存在兩個出現一次的元素。
思路分析:

第一步:將所有元素進行異或,得到只出現一次的兩個元素A、B的異或結果。
第二步:根據上一步得到的異或結果,尋找這兩個元素中最低位(32位整型)第一個出現為1的位置
第三步:根據第二步得到的位置,將原陣列中的元素分成兩個部分進行異或。得到的兩個結果即為解。

解釋關於第三步為什麼可以利用第二步的結果進行分類:如果A、B為兩個不同的數,那麼轉換為32位2進位制時,從低位開始尋找,必定會出現有一個為1,且另外一個為0的位。而將A^B的結果中轉換為32位2進位制,最低為1的位就是前面所尋找的位。(因為1異或0等於1)這樣就可以利用這個位的不同,將原陣列分成兩類,繼而轉換成兩個 只出現一次的數字的問題。

class Solution {
public:
	vector<int> singleNumber(vector<int>& nums) {
		int tempRes = 0;
		//將所有元素異或,得到的結果為出現一次的A^B
		for (auto num : nums) {
			tempRes ^= num;
		}
		//從後往前找出第一位為1的位置
		int diffNum = 1;
		while ((tempRes & diffNum) == 0) {
			diffNum <<= 1;
		}
		int resultA = 0, resultB = 0;
		//根據元素種類進行分類
		for (auto num : nums) {
			if (diffNum & num) {
				resultA ^= num;
			}
			else {
				resultB ^= num;
			}
		}
		vector<int> result = { resultA, resultB };
		return result;
	}
};

在這裡插入圖片描述

相關文章