统计数组中各数字出现的次数

来源:互联网 发布:软件安全漏洞检测技术 编辑:程序博客网 时间:2024/06/06 09:57

给定数组A,大小为n,数组元素为1到n的数字,不过有的数字出现了多次,有的数字没有出现。请给出算法和程序,统计出各数字出现的次数。要求O(n)的时间复杂度,O(1)的空间复杂度。

分析:如果没有空间复杂度限制,遍历的同时用hash表统计各数字即可。当前条件下,可以考虑利用数组自身空间做hash。

第一遍遍历,A[i]=A[i]*(n+1);第二遍遍历,A[A[i]/(n+1)-1]++,整除时减1为防止数组中有n导致数组越界;第三遍遍历,A[i]%(n+1)输出结果。

代码如下:

void Times(int a[], int n){int i;for (i = 0; i < n; i++)a[i] = a[i] * (n + 1);for (i = 0; i < n; i++)a[a[i] / (n + 1) - 1]++;for (i = 0; i < n; i++)cout << a[i] % (n + 1) << " ";cout << endl;}