|
请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
1、首先第一次遍历整个数组,找出不同的那两个数的异或后的结果,见下面这段代码. - for(int i=0;i<length;i++)
- {
- ansXor^=date[i]; //异或
- }
复制代码
2、找到异或结果中ansXor中用移位的方式找到第一个二进制数中为1的位置,这个很关键,找到这个位置后,说明在该位置上,这两个不同的数中,一个为0,一个为1,这个应该可以理解对吧? - int pos=findFirstOne(ansXor);
复制代码
我们把这个位置记为pos
3、然后再遍历一次数组,把这个数组分成两个子数组,pos位上为1的,和pos位上为0的 - for(int i=0;i<length;i++)
- {
- if(testBit(date[i],pos))
- num1^=date[i];
- else
- num2^=date[i];
- }
复制代码 这里借助了异或的原理,pos位置上为1的其它成双成对的数肯定也是为1的,同理,pos位上为0的时也一样。
|