zoukankan      html  css  js  c++  java
  • 计蒜客--单独的数字 (位运算)

    给定一个数组 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 范围内(-2147483648ldots 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
    ", ans);
    55     return 0;
    56 }
  • 相关阅读:
    闭包概念集合
    对象的基本方法
    webpack始出来
    elasticsearch性能调优
    elasticsearch 倒排索引学习
    elasticearch 归并策略
    更加详细的Log4net的配置
    第一篇博客关于Log4net的配置记录
    js数组小结
    javascript在不同的浏览器处理事件
  • 原文地址:https://www.cnblogs.com/wydxry/p/7275787.html
Copyright © 2011-2022 走看看