劍指Offer - 面試題56 - I. 數組中數字出現的次數(異或,分組)

1. 題目

一個整型數組 nums 裏除兩個數字之外,其他數字都出現了兩次。請寫程序找出這兩個只出現一次的數字。

要求時間複雜度是O(n),空間複雜度是O(1)

示例 1:
輸入:nums = [4,1,4,6]
輸出:[1,6][6,1]

示例 2:
輸入:nums = [1,2,10,4,1,4,3,3]
輸出:[2,10][10,2]
 
限制:
2 <= nums <= 10000

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

類似題目:

LeetCode 136. 只出現一次的數字(異或^)
LeetCode 137. 只出現一次的數字 II(位運算)

2. 解題

  • 對數組所有的值全部異或,得到想要求的兩個數的異或值
  • 找到該異或值爲1的bit
  • 用該bit將數組的值分成兩組來,分別求取異或值,即得2個唯一的數
class Solution {
public:
    vector<int> singleNumbers(vector<int>& nums) {
    	int i, XOR = 0;
    	for(i = 0; i < nums.size(); ++i)
    		XOR ^= nums[i];

    	for(i = 0; i < 32; ++i)
    	{
    		if(XOR & (1<<i))
    			break;
    	}
    	int a = 0, b = 0;
    	for(auto& n : nums)
    	{
    		if(n&(1<<i))
    			a ^= n;
    		else
    			b ^= n;
    	}
    	return {a, b};
    }
};

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章