hrbust Find Them
对每个数进行标记,然后判断是否出现奇数次。
Description |
给出N个数(保证N为偶数),其中有且只有两个不同的数字出现了奇数次。请你找出他们来。 |
Input |
对于每组测试数据: 第一行,给出数字N,表示下一行输入N个数字,其中N为偶数(2<=N<=100000) 第二行,有N个数字(每个数字保证可以使用INT表示) 处理到文件结束 |
Output |
对于每组测试数据: 第一行,输出找到的两个数字,由小到大。 |
Sample Input |
4
1 2 3 3
|
Sample Output |
1 2 1 #include<stdio.h> 2 #include<map> 3 #define MAX 100010 4 int a[MAX],h[MAX]; 5 using namespace std; 6 int main() 7 { 8 map<int,int>v; 9 int n,i,j; 10 int b[5]; 11 while(scanf("%d",&n)!=EOF) 12 { 13 v.clear(); 14 for(i=0;i<n;i++) 15 { 16 scanf("%d",&a[i]); 17 v[a[i]]++; 18 } 19 int x=0; 20 for(i=0;i<n;i++) 21 { 22 if(v[a[i]]%2!=0) 23 {h[x]=a[i];x++;} 24 }//先找出出现奇数次的数,全部存在h[]中,这样可以大大的降低时间复杂度。 25 int k=1,m; 26 b[0]=h[0]; 27 for(i=1;i<x;i++) 28 { 29 m=0; 30 for(j=0;j<k;j++) 31 if(h[i]!=b[j]) 32 {m++;} 33 if(m==k) 34 {b[k]=h[i];k++;} 35 }//将h[]中的两个数取出来。 36 if(b[0]>b[1]) 37 printf("%d %d\n",b[1],b[0]); 38 else printf("%d %d\n",b[0],b[1]); 39 } 40 return 0; 41 }
另一种时间复杂度比较大的,超时了。在设计算法时还是要好好的设计一下,不能只满足写出来。那样才有进步。 1 #include<stdio.h> 2 #include<map> 3 #include<string.h> 4 #define MAX 100010 5 int a[MAX],h[MAX]; 6 using namespace std; 7 int main() 8 { 9 map<int,int>v; 10 int n,i,j; 11 int b[5]; 12 while(scanf("%d",&n)!=EOF) 13 { 14 v.clear(); 15 for(i=0;i<n;i++) 16 { 17 scanf("%d",&a[i]); 18 v[a[i]]++; 19 } 20 int k=1,m; 21 h[0]=a[0]; 22 for(i=0;i<n;i++) 23 { 24 m=0; 25 for(j=0;j<k;j++) 26 if(a[i]!=h[j]) 27 {m++;} 28 if(m==k) 29 {h[k]=a[i];k++;} 30 }//时间比较长,超时了的算法。 31 int x=0; 32 for(i=0;i<k;i++) 33 if(v[h[i]]%2!=0) 34 { 35 b[x]=h[i]; 36 x++; 37 } 38 if(b[0]>b[1]) 39 printf("%d %d\n",b[1],b[0]); 40 else printf("%d %d\n",b[0],b[1]); 41 } 42 return 0; 43 }
|