这道题有问题,原以为交集是集合,集合是没有重复元素的。但是其实:
input:
3 -1
3 3 -1
output:
3
input:
3 3 -1
3 -1
output:
3
input:
3 3 -1
3 3 -1
output:
3 3
导致二分搜索不好用(请原谅我用的是数组),要额外一个数组保存次数。
我的是hash加二分查找
// UNSOVLED
/*
3 -1
3 3 -1
3 3 -1
3 -1
3 3 -1
3 3 -1
*/
#include <stdio.h>
#define debug printf
#define MAX 65535
char flag[MAX+1];
int big[10001][2];
int main()
{
freopen("in.txt", "r", stdin);
int i=0, j=0;
int n1, n2;
int l=0, r=0, m;
char* f = &flag[1];
do{
scanf("%d", &n1);
if(n1 < MAX)
f[n1]++; // in case there're some same numbers
else{
big[i][1]++;
big[i++][0] = n1;
}
}while(n1!=-1);
do{
scanf("%d", &n2);
if(-1 == n2) break;
if(n2 < MAX){// hash
if(f[n2] > 0){
if(0==j) printf("%d", n2);
else printf(" %d", n2);
f[n2]--;
j++;
}
}
else{// binary
r=i-1;
while(l <= r){
m = (l+r)/2;
if(big[m][0] == n2){
if(big[m][1] == 0) break;
if(0==j) printf("%d", n2);
else printf(" %d", n2);
big[m][0]--;
j++;
break;
}
else if(big[m][0] > n2)
r = m-1;
else
l = m+1;
}
if(l>0) l--; // in case big[l-1]==big[l]
}
}while(1);
if(0==j) printf("NULL");
return 0;
}
当然用链表或数组直接交互遍历最简便。