在一个长度为n的整形数组a里,除了三个数字只出现一次外,其他的数字都出现了2次。请写程序输出任意一个只出现一次的数字,程序时间和空间复杂度越小越好。
例如: a = {1,3,7,9,5,9,4,3,6,1,7},输出4或5或6
C/C++:

理解: 在这里找出出现一次的数是根据flips=lowbit(a^b)^lowbit(a^c)^lowbit(b^c),这是为什么呢,我们可以用图形化的方式来理解这个问题。

// lowbit表示的是某个数从右往左扫描第一次出现1的位置
int lowbit(int x)
{
return x&~(x-1);
}

void find(int* a , int n)
{
int i , xors;
xors = 0;
for(i = 0 ; i < n ; ++i)
xors ^= a[i];
// 三个数两两的异或后lowbit有两个相同,一个不同,可以分为两组
int fips = 0;
for(i = 0 ; i < n ; ++i)
fips ^= lowbit(xors ^ a[i]);
// 表示的是:flips=lowbit(a^b)^lowbit(a^c)^lowbit(b^c)
int b; // 假设三个只出现一次的其中一个数为b
b = 0;
for(i = 0 ; i < n ; ++i)
{
if(lowbit(xors ^ a[i]) == fips)
b ^= a[i];
}
// 成功找到三个数中一个数
cout<<b<<endl;
}

优质内容筛选与推荐>>
1、JAVA8-让代码更优雅之List排序
2、23种设计模式全解析
3、oracle 工作机制 如何工作的
4、sklearn 中的 Pipeline 机制
5、项目进展02


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号