问题描述
在校园网络监控系统中,小明需要实时识别出当前最热门的访问数据(即出现频率最高的数据项)。但由于服务器资源有限,他不能使用传统的哈希表统计方法,因为那样会占用过多内存。小明发现,除了一个热点数据外,其他所有数据出现的次数都恰好是两次,而热点数据出现的次数是三次——这恰好能帮助他快速定位问题。
要求:
- 设计一个算法,在 O(n) 时间复杂度内找出出现三次的热点数据,其中 n 是数据流的大小。
- 尽量降低空间复杂度,不能使用超过 O(1) 的额外空间(即常数空间)。
测试样例
样例1:
输入:
data = [1, 2, 3, 2, 1, 3, 1]输出:1解释:数字 1 出现了三次,数字 2 和 3 各出现两次。
样例2:
输入:
data = [5, 5, 5, 9, 9, 8, 8]输出:5解释:数字 5 出现三次,数字 9 和 8 各出现两次。
样例3:
输入:
data = [0, 1, 0, 1, 0, 2, 2]输出:0解释:数字 0 出现三次,数字 1 和 2 各出现两次。
约束条件
- 3 ≤ data.length ≤ 1001,且 data.length 为奇数
- 0 ≤ data[i] ≤ 1000
- 数据流中除了一个热点数据出现三次外,其余每个数据都恰好出现两次
- 必须使用常数额外空间(不能使用哈希表等结构)
程序代码
#include <stdio.h>
int findHotspot(int* data, int dataSize) {
int result = 0;
for (int i = 0; i < dataSize; i++) {
result ^= data[i];
}
return result;
}
int main() {
int data1[] = {1, 2, 3, 2, 1, 3, 1};
int data2[] = {5, 5, 5, 9, 9, 8, 8};
int data3[] = {0, 1, 0, 1, 0, 2, 2};
printf("%d\n", findHotspot(data1, 7)); // 1
printf("%d\n", findHotspot(data2, 7)); // 5
printf("%d\n", findHotspot(data3, 7)); // 0
return 0;
}
#include <stdio.h>
int findHotspot(int* data, int dataSize) {
int result = 0;
for (int i = 0; i < dataSize; i++) {
result ^= data[i];
}
return result;
}
int main() {
int data1[] = {1, 2, 3, 2, 1, 3, 1};
int data2[] = {5, 5, 5, 9, 9, 8, 8};
int data3[] = {0, 1, 0, 1, 0, 2, 2};
printf("%d\n", findHotspot(data1, 7)); // 1
printf("%d\n", findHotspot(data2, 7)); // 5
printf("%d\n", findHotspot(data3, 7)); // 0
return 0;
}
运行结果


959

被折叠的 条评论
为什么被折叠?



