计蒜客--单独的数字 (位运算)

给定一个数组 AA,除了一个数出现一次之外,其余数都出现三次。找出出现一次的数。

如:\{1, 2, 1, 2, 1, 2, 7\}{1,2,1,2,1,2,7},找出 77。

你的算法只能是线性时间的复杂度,并且不能使用额外的空间哦~

输入格式

第一行输入一个数 n(1 \leq n \leq 500)n(1n500),代表数组的长度。

接下来一行输入 nn 个 int 范围内(-2147483648\ldots 214748364721474836482147483647)的整数,表示数组 AA。保证输入的数组合法。

输出格式

输出一个整数,表示数组中只出现一次的数。

样例输入

4
0 0 0 5

样例输出

5
题解:还是两种解法
第一种:统计出现次数大于一次就跳到下一个数字 知道另外一个数字出现次数为一
 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <vector>
 6 #include <cstdlib>
 7 #include <iomanip>
 8 #include <cmath>
 9 #include <ctime>
10 #include <map>
11 #include <set>
12 #include <queue>
13 using namespace std;
14 #define lowbit(x) (x&(-x))
15 #define max(x,y) (x>y?x:y)
16 #define min(x,y) (x<y?x:y)
17 #define MAX 100000000000000000
18 #define MOD 1000000007
19 #define pi acos(-1.0)
20 #define ei exp(1)
21 #define PI 3.141592653589793238462
22 #define INF 0x3f3f3f3f3f
23 #define mem(a) (memset(a,0,sizeof(a)))
24 typedef long long ll;
25 ll gcd(ll a,ll b){
26     return b?gcd(b,a%b):a;
27 }
28 bool cmp(int x,int y)
29 {
30     return x>y;
31 }
32 const int N=10005;
33 const int mod=1e9+7;
34 int a[505];
35 int main()
36 {
37     std::ios::sync_with_stdio(false);
38     int n,t;
39     cin>>n;
40     for(int i=0;i<n;i++)
41         cin>>a[i];
42     for(int i=0;i<n;i++){
43         t=0;
44         for(int j=0;j<n;j++){
45             if(a[i]==a[j]) t++;
46             if(t>1) break;
47         }
48         if(t==1){
49             cout<<a[i]<<endl;
50             return 0;
51         }
52     }
53     return 0;
54 }

第二种:位运算

由于除了一个特殊的数外,其他的数都有 3 个,使用二进制的位运算,既然其他每次数都出现3次,那么如果针对每一位求和并对3取余,那么那些出现3次的数字在这一位的和对3取余后肯定是0。如:

1: 0 0 0 1 
2: 0 0 1 0 
1: 0 0 0 1 
2: 0 0 1 0 
1: 0 0 0 1 
2: 0 0 1 0 
7: 0 1 1 1 
───────── 
 0 1 4 4

0 1 4 4 每位除以3取余 得 0 1 1 1 => 7

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <vector>
 6 #include <cstdlib>
 7 #include <iomanip>
 8 #include <cmath>
 9 #include <ctime>
10 #include <map>
11 #include <set>
12 #include <queue>
13 using namespace std;
14 #define lowbit(x) (x&(-x))
15 #define max(x,y) (x>y?x:y)
16 #define min(x,y) (x<y?x:y)
17 #define MAX 100000000000000000
18 #define MOD 1000000007
19 #define pi acos(-1.0)
20 #define ei exp(1)
21 #define PI 3.141592653589793238462
22 #define INF 0x3f3f3f3f3f
23 #define mem(a) (memset(a,0,sizeof(a)))
24 typedef long long ll;
25 ll gcd(ll a,ll b){
26     return b?gcd(b,a%b):a;
27 }
28 bool cmp(int x,int y)
29 {
30     return x>y;
31 }
32 const int N=10005;
33 const int mod=1e9+7;
34 int a[505];
35 int main()
36 {
37     std::ios::sync_with_stdio(false);
38      int sum[32], n, a;
39     for(int i=0; i<32; i++){
40         sum[i] = 0;
41     }
42     scanf("%d", &n);
43     for(int i=0; i<n; i++){
44         scanf("%d", &a);
45         for(int j=0; j<32; j++){
46             sum[j]+=a>>j&1;  //取最后一位,累计求和
47             sum[j]%=3;
48         }
49     }
50     int ans = 0;
51     for(int i=0; i<32; i++){
52         ans += sum[i]<<i;
53     }
54     printf("%d\n", ans);
55     return 0;
56 }
posted @ 2017-08-02 20:03  wydxry  阅读(305)  评论(0编辑  收藏  举报
Live2D