《算法的乐趣》序言中提到一道题目。
有一个由若干正整数组成的数列,数列中的每个数都不 超过32,已知数列中存在重复的数字,请给出一个算法找出这个数列中所有重复出现的数。我期 望求职者给我一个正确的算法实现,接下来我会问这个算法的时间复杂度是什么,有没有考虑过 存在一个O(n)时间复杂度的算法。
//题目假定为100个数
const int totalNumbers = 100;
int numbers[totalNumbers] = {0};
//初始化,所有数字都是1-32
for (int i = 0; i < totalNumbers; i++) {
numbers[i] = rand()%32+1;
printf("初始化数字%d\t", numbers[i]);
}
//计数,第0位空出
int count[33] = {0};
for (int i = 0; i < totalNumbers; i++) {
count[numbers[i]] += 1;
}
//输出结果
for (int i = 1; i < 33; i++) {
if (count[i] > 1) { //超过1个,则为重复
printf("重复数字%d\t", i);
}
}
这个题目应该蛮简单的。