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 }

 

posted @ 2012-09-29 08:51  尔滨之夏  阅读(649)  评论(0编辑  收藏  举报