点击打开链接
1000ms 65536K
给定一个数组 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。保证输入的数组合法。
输出一个整数,表示数组中只出现一次的数。
我的做法:
#include<cstdio> #include<algorithm> using namespace std; int main() { int n,a[505]; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&a[i]); sort(a,a+n); if(n==1) { printf("%d\n",a[0]); return 0; } if(a[0]!=a[1]) { printf("%d\n",a[0]); return 0; } if(a[n-1]!=a[n-2]) { printf("%d\n",a[n-1]); return 0; } for(int i=1;i<n-1;i++) { if(a[i]!=a[i-1]&&a[i]!=a[i+1]) { printf("%d\n",a[i]); return 0; } } return 0; }我同学的做法: #include<iostream> #include<stdio.h> #include<stdlib.h> #include<math.h> using namespace std; int main() { int N; while(cin>>N) { int com[32]= {}; while(N--) { int temp; cin>>temp; for(int i=0; i<32; i++) com[i]+=((temp>>i)&1); } int pow2=1,ans=0; for(int i=0; i<32; i++) { ans+=pow2*(com[i]%3); pow2*=2; } cout<<ans<<endl; } return 0; }