C语言/数据结构位运算题解:异或XOR找出出现三次的热点数据——其余均出现两次

问题描述

在校园网络监控系统中,小明需要实时识别出当前最热门的访问数据(即出现频率最高的数据项)。但由于服务器资源有限,他不能使用传统的哈希表统计方法,因为那样会占用过多内存。小明发现,除了一个热点数据外,其他所有数据出现的次数都恰好是两次,而热点数据出现的次数是三次——这恰好能帮助他快速定位问题。

要求:

  1. 设计一个算法,在 O(n) 时间复杂度内找出出现三次的热点数据,其中 n 是数据流的大小。
  2. 尽量降低空间复杂度,不能使用超过 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;
}

运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Logic101

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值