给定一个数组 AA,除了一个数出现一次之外,其余数都出现三次。找出出现一次的数。
如:{1, 2, 1, 2, 1, 2, 7}{1,2,1,2,1,2,7},找出 77。
你的算法只能是线性时间的复杂度,并且不能使用额外的空间哦~
输入格式
第一行输入一个数 n(1 \leq n \leq 500)n(1≤n≤500),代表数组的长度。
接下来一行输入 nn 个 int 范围内(-2147483648\ldots 2147483647−2147483648…2147483647)的整数,表示数组 AA。保证输入的数组合法。
输出格式
输出一个整数,表示数组中只出现一次的数。
一道基础的位运算,但是不熟悉位运算的愚蠢的我wa了好几发,看了别人的代码之后,坚持用自己的想法A了出来(想不到吧![滑稽])
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n,x,s[32],ans;//从2的0次方一直到2的31次方
int main()
{
memset(s,0,sizeof(s));
ans=0;
scanf("%d",&n);
while(n--)
{
scanf("%d",&x);//任意一个x都可以用2的幂次方的和来表示
for(int i=0;i<32;i++)
{
if(x&(1<<i))
s[i]++;
//s[i]+=((x>>i)&1);也可以这样写
//(x>>i)&1判断x的组成式中有没有2的i次方
}
}
/*for(int i=0;i<32;i++)
printf("%d ",s[i]);printf("\n"); */
int pow2=1;
for(int i=0;i<32;i++)
{
/*ans+=pow2*(s[i]%3);
pow2*=2;*/也可以这样写
ans+=(1<<i)*(s[i]%3);
}
printf("%d\n",ans);
return 0;
}