找出整型数组中占比超过一半的数 | 豆包MarsCode AI刷题

53 阅读3分钟

找出整型数组中占比超过一半的数

问题描述

小R从班级中抽取了一些同学,每位同学都会给出一个数字。已知在这些数字中,某个数字的出现次数超过了数字总数的一半。现在需要你帮助小R找到这个数字。


测试样例

样例1:

输入:array = [1, 3, 8, 2, 3, 1, 3, 3, 3]
输出:3

样例2:

输入:array = [5, 5, 5, 1, 2, 5, 5]
输出:5

样例3:

输入:array = [9, 9, 9, 9, 8, 9, 8, 8]
输出:9

#include <stdio.h>
#include <stdlib.h>

int solution(int array[], int n) {
    // 创建一个数组来模拟字典
    int max_num = 10000; // 假设数字的范围在0到9999之间
    int count[max_num];
    for (int i = 0; i < max_num; i++) {
        count[i] = 0;
    }

    // 遍历数组并统计每个数字的出现次数
    for (int i = 0; i < n; i++) {
        count[array[i]]++;
        if (count[array[i]] > n / 2) {
            return array[i];
        }
    }
}

int main() {
    // 测试样例
    int array1[] = {1, 3, 8, 2, 3, 1, 3, 3, 3};
    int n1 = sizeof(array1) / sizeof(array1[0]);
    printf("%d\n", solution(array1, n1) == 3); // 输出:1 (True)

    int array2[] = {5, 5, 5, 1, 2, 5, 5};
    int n2 = sizeof(array2) / sizeof(array2[0]);
    printf("%d\n", solution(array2, n2) == 5); // 输出:1 (True)

    int array3[] = {9, 9, 9, 9, 8, 9, 8, 8};
    int n3 = sizeof(array3) / sizeof(array3[0]);
    printf("%d\n", solution(array3, n3) == 9); // 输出:1 (True)

    return 0;
}

代码解释

  1. 数组模拟字典

    • 我们假设数字的范围在0到9999之间,因此创建了一个大小为10000的数组count来存储每个数字的出现次数。
  2. 统计数字出现次数

    • 遍历输入数组array,对于每个数字,增加其在count数组中的计数。
  3. 检查是否超过一半

    • 在每次增加计数后,检查该数字的出现次数是否超过数组长度的一半。如果是,则返回该数字。

题目分析

在班级中每个同学手上都有一个数,其中某个数字出现的次数大于总数的一半,找到此数。

解题思路

本代码采用C语言来解决,可以仿照python创建一个字典,起初每个数字出现的次数都为0,通过一次次的遍历对出现的数字进行增加,然后判断次数是否大于所有数字个数的一半。巧妙之处在于通过数组的下标这一特性可以很好的统计每个数字出现的次数,使得代码更加简洁易懂。

分享

经过每天的刷题我感觉关键点在于通过问题去复习自己学过的知识,以及好的算法思路,增加自己对算法的敏感度,对于简单的问题可以通过简单的方式去解决而不是暴力算法,学习是个过程要一步一步的走,脚踏实地的走完了每一步路,那么我想结果也不会差到哪里去。