您的位置:首页 > 编程语言 > C语言/C++

C++编程,输出给定int数组中的重复元素,元素取值有上限

2016-02-24 10:42 344 查看
如题所述,给出数组{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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: