给定数组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;
}