今天学长极力推荐在博客上写题解,而且还偶然搜到了同校某萌妹纸的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上的提问