《剑指offer》数组中只出现一次的数字

本文介绍了解决整型数组中除两个数字外其余数字均出现两次的问题,通过异或运算找到这两个只出现一次的数字,并详细解释了实现过程。

【 声明:版权所有,转载请标明出处,请勿用于商业用途。  联系信箱:libin493073668@sina.com】


题目链接:http://www.nowcoder.com/practice/e02fdb54d7524710a7d664d082bb7811?rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking


题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

思路
这道题一开始要想到最好的解法很难,如果使用排序的话时间复杂度并不好,那么我们怎么才能使用最好的复杂度来解决呢?
首先我们先考虑怎么找只有一个数字出现一次的状况,我们可以通过异或运算,一遍下来得到的异或值就是只出现一次的数值。
那么如果有两个数字只出现一次呢?我们可以知道这两个数字必然是不同的,那么我们一遍异或下来的值必然是这两个数的异或值,然后我们可以使用这个异或值来把整个数组划分为两个区间。
我们首先找到异或值最右边的1出现的位置,对于这个位置而言,我们要求的这两个数在这个位置必然是不同的,那么我们就可以将数组分为两部分,使得要求的这两个数分别在这两个区间里面,然后我们再分别进行异或就可以了。
而我们知道,对于X&(-X)所求的,正式X最右边的1所处的位置得到的值。


class Solution
{
	public:
		void FindNumsAppearOnce(vector<int> data,int* num1,int *num2)
		{
			int len = data.size();
			if(len<2)
				return;
			int Xor = 0;
			for(int i = 0; i<len; i++)
				Xor^=data[i];
			Xor = Xor&(-Xor);
			*num1 = *num2 = 0;
			for(int i = 0; i<len; i++)
			{
				if(data[i]&Xor)
					*num1^=data[i];
				else
					*num2^=data[i];
			}
		}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值