异形数

编程入门 行业动态 更新时间:2024-10-25 06:26:16

<a href=https://www.elefans.com/category/jswz/34/1733542.html style=异形数"/>

异形数

在一个长度为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;
}

转载于:.html

更多推荐

异形数

本文发布于:2024-02-11 14:18:15,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1681435.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:异形

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!