数组中只出现一次的数字

数组中只出现一次的数字

题目描述

在这里插入图片描述

解题思路:
  • 如果说两个数字不是那么好处理的话,可以先想象一下,如果数组中只有一个数字只出现了一次,其他的数字都出现了两次,那么这个问题怎么解决?
  • 可以想到异或运算有一个性质,任何一个数字异或他自己的结果都是0,也就是说,如果我们从头到尾依次异或数组中的每个数字,那么最终的结果就是那个数组中只出现了一次的数字,因为那些承兑出现的两个数字再异或的过程中全部都抵消了。
  • 那么现在对两个数字同样进行相同的思考思路,可以尝试着把原先的数组分成两个子数组,使得每个子数组中包含一个只出现一次的数字,而其他的数字都是成对的出现两次,如果可以拆分成为两个数组的话,那么找出两个只出现一次的数字就很容易了。
  • 我们还是从头到尾依次异或数组中的每个元素,那么最终得到的结果就是两个只出现了一次的数字的异或结果,又因为这两个数字肯定不一样,那么异或的结果肯定就不为0了,也就是说最后异或的结果的那个数字的二进制位中肯定有一位是1。我们可以在结果数字中找到第一个位1的位的位置,记成第n位,那么现在就可以以第n位到底是不是1来对原先的数组进行划分,将其划分为两个数组,那么这样,就把原先的数组分成两个数组了,两个数组中分别含有只出现了一次的数字,那么就很好找出来了。
代码如下所示:
class Solution {
public:
	void FindNumsAppearOnce(vector<int> data, int* num1, int* num2)
	{
		if (data.size() < 2)
			return;
		int size = data.size();
		int temp = data[0];
		for (int i = 1; i < size; i++)
			temp = temp ^ data[i];
		if (temp == 0)
			return;
		int index = 0;
		while ((temp & 1) == 0)
		{
			temp = temp >> 1;
			++index;
		}
		*num1 = *num2 = 0;
		for (int i = 0; i < size; i++)
		{
			if (IsBit(data[i], index))
				* num1 ^= data[i];
			else
				*num2 ^= data[i];
		}
	}
	bool IsBit(int num, int index)
	{
		num = num >> index;
		return (num & 1);
	}
};
测试用例
  • 功能测试: 代码中有重复的数字,代码中没有重复的数字
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值