找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 627|回复: 0

一个整型数组里除了两个数字之外,其他的数字都出现了两次

[复制链接]

205

主题

173

回帖

6925

积分

论坛元老

积分
6925
发表于 2013-8-22 11:11:01 | 显示全部楼层 |阅读模式
请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)
  1. #include<iostream>
  2. using namespace std;
  3. int findFirstOne(int value);
  4. bool testBit(int value,int pos);
  5. int findNums(int array[],int length,int &num1,int &num2){
  6.     if(length<2){return -1;}
  7.     int ansXor=0;
  8.     for(int i=0;i<length;i++)
  9.     {
  10.         ansXor^=array[i];               //异或
  11.     }
  12.     int pos=findFirstOne(ansXor);
  13.     num1=num2=0;
  14.     for(int i=0;i<length;i++)
  15.     {
  16.         if(testBit(array[i],pos))
  17.             num1^=array[i];
  18.         else
  19.             num2^=array[i];
  20.     }
  21.     return 0;
  22. }
  23. int findFirstOne(int value)
  24. {     //取二进制中首个为1的位置
  25.     int pos=1;
  26.     while((value&1)!=1)
  27.     {
  28.         value=value>>1;
  29.         pos++;
  30.     }
  31.     return pos;
  32. }
  33. bool testBit(int value,int pos)
  34. {  //测试某位置是否为1
  35.     return ((value>>pos)&1);
  36. }
  37. int main(void)
  38. {
  39.     int array[10]={1,2,3,4,5,6,4,3,2,1};
  40.     int num1,num2;
  41.     if(findNums(array,10,num1,num2)==0)
  42.         cout<<num1<<" "<<num2<<endl;
  43.     else
  44.         cout<<"error"<<endl;
  45.     return 0;
  46. }
复制代码


1、首先第一次遍历整个数组,找出不同的那两个数的异或后的结果,见下面这段代码.
  1. for(int i=0;i<length;i++)
  2. {
  3.         ansXor^=date[i];               //异或
  4.     }
复制代码

2、找到异或结果中ansXor中用移位的方式找到第一个二进制数中为1的位置,这个很关键,找到这个位置后,说明在该位置上,这两个不同的数中,一个为0,一个为1,这个应该可以理解对吧?
  1. int pos=findFirstOne(ansXor);
复制代码

我们把这个位置记为pos

3、然后再遍历一次数组,把这个数组分成两个子数组,pos位上为1的,和pos位上为0的
  1. for(int i=0;i<length;i++)
  2. {
  3.         if(testBit(date[i],pos))
  4.            num1^=date[i];
  5.        else
  6.             num2^=date[i];
  7. }
复制代码
这里借助了异或的原理,pos位置上为1的其它成双成对的数肯定也是为1的,同理,pos位上为0的时也一样。






您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

果子博客
扫码关注微信公众号

Archiver|手机版|小黑屋|风叶林

GMT+8, 2026-2-1 12:30 , Processed in 0.085111 second(s), 20 queries .

Powered by 风叶林

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表