欢迎光临
我们一直在努力

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

问题描述

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

要求:

  • 设计一个算法,在 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;
    }

    运行结果

    赞(0)
    未经允许不得转载:171主机测评 » C语言/数据结构位运算题解:异或XOR找出出现三次的热点数据——其余均出现两次
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址