如题所述,给出数组{1, 3, 4, 1, 5, 6, 4, 3, 2, 1},应该输出1, 4, 3, 1。现给定数组a,其长度为n,其中元素取值上限为max。要求时间复杂度为o(n),空间复杂度尽可能地小。
考虑位运算的方法,创建一个char型数组c,保证此数组中元素的总位数(8*x)不小于max,初始值全为char(0)。遍历数组a,将其元素数值作为下标标记c中对应位置。若已被标记,则说明元素重复。代码如下。
#include<iostream>
using namespace std;
void printDuplicate(int *a, int n, int max) {
int i, m = max / 8 + 1, i1, i2;
char *c = new char[m], t;
for (i=0; i<m; i++) {
c[i] = char(0);
}
for (i=0; i<n; i++) {
t = char(1);
i1 = a[i] / 8; //i1表示对应位置在第i1个字符上
i2 = a[i] % 8; //i2表示对应位置在第i1个字符的i2位上
t = t << i2;
if (char(c[i1] & t) == char(0)) {
c[i1] = c[i1] | t;
} else {
cout << a[i] << endl;
}
}
}
void main() {
int a[] = {1, 3, 4, 1, 5, 6, 4, 3, 2, 1};
printDuplicate(a, 10, 6);
}