zoukankan      html  css  js  c++  java
  • 在其余数都出现3次,找到恰好出现一次的那个数

    分析:考虑一下答案,因为n-1个数中每个数都会出现3次,那么这些数对应的二进制为也就是出现3次

    剩下那个是只出现一次,举个栗子 n=4  3 3 3 1

    那么二进制表示

    11

    11

    11

    01

    也就是说,找到二进制下%3意义下出现1次的那些二进制,模拟一下就ok  复杂度O(n*32)

    不过可以考虑简化一下,增加一个变量模拟一下%3的过程,先只考虑一个二进制位,如何实现%3的+

    0 0

    1 0

    0 1

    0 0

    大致就是表示,even=odd&1   odd^=1  p=~(even&odd)   even&=p  odd&=p

    然后把这个结论扩展到32位就行了

    #include<iostream>
    #define rep(i,a,b) for(int i=a;i<=b;i++)
    #define per(i,a,b) for(int i=a;i>=b;i--)
    using namespace std;
    const int maxn=1e5+5;
    int n,val;
    
    int main(){
        cin>>n;
        int even=0,odd=0;
    
        rep(i,1,n){
            cin>>val;
            even|=odd&val;
            odd^=val;
            int p=~(odd&even);
            even&=p;
            odd&=p;
        }
        cout<<odd<<endl;
    
        return 0;
    }
    

      

  • 相关阅读:
    BUAA OO Unit1 表达式求导
    中介者模式
    命令模式
    观察者模式
    解释器模式
    策略模式
    迭代器模式
    模板方法模式
    代理模式
    桥接模式
  • 原文地址:https://www.cnblogs.com/jihe/p/6943595.html
Copyright © 2011-2022 走看看