今天在微博上看到的一道面试题,觉得非常有意思,特记录下来。

  原题是这样的:

      给定数组A,大小为n,数组元素为1到n的数字,不过有的数字出现了多次,有的数字没有出现。请给出算法和程序,统计哪些数字没有出现,哪些数字出现了多少次。能够在O(n)的时间复杂度,O(1)的空间复杂度要求下完成么?

  这道题目最大的难点就在于时空限制,确切的说是空间限制,如果没有空间复杂度为O(1)的要求,我们很容易想出用一个hash表来记录元素的出现次数。实现的代码如下:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 
 5 int a[1001];
 6 int b[1001]
 7 int n;
 8 void solve4()
 9 {
10      for(int i=1; i<=n; i++)
11      {
12           b[a[i]]++;
13      }
14      for(int i=1; i<=n; i++)
15           printf("%d\n",b[i]);
16 }
17 int main()
18 {
19      freopen("1.in","r",stdin);
20      freopen("1.out","w",stdout);
21      
22      scanf("%d",&n);
23      for(int i=1; i<=n; i++)
24      {
25           scanf("%d",&a[i]);
26      }
27      solve4();
28      
29      return 0;     
30 }
View Code

相关文章: