剑指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};
    }
};

在这里插入图片描述

发布了718 篇原创文章 · 获赞 723 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/qq_21201267/article/details/104827266
今日推荐