今天在微博上看到的一道面试题,觉得非常有意思,特记录下来。
原题是这样的:
给定数组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 }