BUPTOJ_0084_Single Number_题解

写在前面的话:

今天学长极力推荐在博客上写题解,而且还偶然搜到了同校某萌妹纸的blog。于是,duang,就有了这个博客。

有点懒,第一篇直接copy的原来放在Lofter的题解处女作(也是唯一一作 笑cry~)

以后或许会逐渐多起来吧

BUPTOJ_0084_Single Number

时间限制 1000 ms 内存限制 65536 KB
____
题目描述

Given an array with N integers where all elements appear three times except for one. Find out the one which appears only once.
____
输入格式

Several test cases are given, terminated by EOF.

Each test case consists of two lines. The first line gives the length of array N(1≤N≤10^5), and the other line describes the N elements. All elements are ranged in [0,2^63−1].
____
输出格式

Output the answer for each test case, one per line.

最初的想法是都读到一个数组里,然后用快排,再遍历一遍。应该是O(nlogn)吧,T了。

之后想用桶排。但是数据太大了。

搜索了一下,才知道这道题应该用位运算来做。。。

参考了 AC_Von 的博文,又去quora找了找,自己试着写了一个。

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

int N=0;

unsigned long long int one=0;

unsigned long long int two=0;

unsigned long long int t1=0;

unsigned long long int t2=0;

unsigned long long int in=0;



int main(){

    while (scanf("%d",&N)!=EOF) {

    int n=N;

    while (n--) {

        scanf("%lld",&in);

            t1=t2=in;

            t1&=one;

            t2&=two;

            in^=(t1+t2);

            two-=t2;

            one-=t1;

            one+=in;

            two+=t1;

        }

        printf("%lld\n",one);

        one=two=t1=t2=in=0;

    }

    return 0;

}

中心思想和AC_Von,quora上的回答一样,统计哪些二进制位只出现了两次。one,two分别记录出现了一次,两次的二进制位。对于输入的数的二进制位,只有三种情况:1:one,two都没有-》第一次出现-》写进one;2:one有,two没有-》出现过一次-》从one中清除,写进two;3:one没有,two有-》出现过两次-》从two中清除。

原题链接

AC_Von的博文

Quora上的提问

你可能感兴趣的:(BUPTOJ_0084_Single Number_题解)