因为这里的话,去重使用桶不知道最大上线范围,浪费时间,所以不用桶排序去做,直接两个数组都排好序,如果说这两个数组的值有相同的话,一定会在归并排序的归并上遇到,遇到两个相同的,新数组中只放一个,遇到两个相同或者说和新数组最后一个相同的,就都去掉,第一次的话是因为数组开的不够大,所以错误了,第二次修改了数组大小之后就可以了。
#include<iostream> #include<string.h> #include<algorithm> using namespace std; int a[1005],b[1005],c[1005]; int main(){ int n,m; while(cin>>n){ for(int i=0;i<n;i++){ cin>>a[i]; } sort(a,a+n); cin>>m; for(int i=0;i<m;i++){ cin>>b[i]; } sort(b,b+m); //处理第一个值 int i=0,j=0,k=0; if(a[0]<b[0]){ c[k++]=a[i++]; }else if(a[0]>b[0]){ c[k++]=b[j++]; }else{ c[k++]=a[i++]; j++; } while(i<n&&j<m){ if(a[i]<b[j]){ if(c[k-1]!=a[i]){ c[k++]=a[i++]; }else{ i++; } }else if(a[i]>b[j]){ if(c[k-1]!=b[j]){ c[k++]=b[j++]; }else{ j++; } }else{ if(c[k-1]==a[i]){ i++; j++; }else{ c[k++]=a[i++]; j++; } } } //剩余数字如果没有全部写进去 while(i<n){ if(c[k]==a[i]){ i++; }else{ c[k++]=a[i++]; } } while(j<m){ if(c[k]==b[j]){ j++; }else{ c[k++]=b[j++]; } } for(int i=0;i<k;i++){ cout<<c[i]; } cout<<endl; } return 0; }