HOJ 1128 Find Them
Time Limit: 1000 MS Memory Limit: 65536 K
Total Submit: 741(197 users) Total Accepted: 225(176 users) Rating: Special Judge: NoDescription
给出N个数(保证N为偶数),其中有且只有两个不同的数字出现了奇数次。请你找出他们来。Input
对于每组测试数据:
第一行,给出数字N,表示下一行输入N个数字,其中N为偶数(2<=N<=100000)
第二行,有N个数字(每个数字保证可以使用INT表示)
处理到文件结束
Output
对于每组测试数据:
第一行,输出找到的两个数字,由小到大。
Sample Input
4
1 2 3 3
Sample Output
1 2
先写我自己的一个做法…大佬轻点打..
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct node{
char number[6];
int num;
}number[100000];
int cmp(const void *, const void *);
int main(){
int i,t;
int n,m,max;
while(~scanf("%d",&n)){
getchar();
max = 0;
getchar
for(i = 0; i < n; i++){
for(t = 0; t < max; t++){
if(number[t].number == m){
number[t].num++;
number[t].num %= 2;
break;
}
}
if(t == max){
number[t].number = m;
number[t].num = 0;
max++;
}
}
qsort(number,max,sizeof(number[0]),cmp);
printf("%d %d\n",number[0].number,number[1].number);
}
return 0;
}
int cmp(const void * a, const void * b){
struct node * c = (struct node *) a;
struct node * d = (struct node *) b;
if(c->num == d->num) return c->number - d->number;
else return c->num - d->num;
}
完全是暴力的一种做法 最后超时了
然后搜了一下 发现了一种很奇妙的解法
利用0^a = a, a ^ b = c, a^c = b。用这个特性对数组进行分组
然后分别求出a,b中一个数,最后解出答案
#include<stdio.h>
int number[100000];
int main(){
int i,j;
int n,m;
int num1,num2;
while(~scanf("%d",&n)){
num1 = 0;
for(i = 0; i < n; i++){
scanf("%d",&number[i]);
num1 ^= number[i];
}
num2 = num1;
for(j = 1;; j = j * 2){
if(j & num1) break;
}
num1 = 0;
for(i = 0; i < n; i++){
if(j & number[i]) num1 = num1 ^ number[i];
}
num2 = num2 ^ num1;
if(num2 < num1){
j = num1;
num1 = num2;
num2 = j;
}
printf("%d %d\n",num1,num2);
}
return 0;
}