📜  C测验– 111 |问题3(1)

📅  最后修改于: 2023-12-03 15:30:15.356000             🧑  作者: Mango

C测验- 111 | 问题3

本题要求编写一个函数,接收一个整形数组和数组长度作为参数,返回该数组的众数。如果数组没有众数,则返回0。

简单来说,众数就是在一个数组中出现次数最多的元素,也就是说它在该数组中出现的次数大于数组长度的一半。

解题思路

从该数组中找到众数,只需要遍历一遍数组,并记录每个元素出现的次数,最后找到出现次数最多的元素即可。

在具体实现时,可以使用一个字典(即哈希表)来记录每个元素出现的次数。遍历数组时,对于每个元素,如果它已经在字典中出现过,则将其对应的值加1;否则,在字典中添加该元素并将其对应的值初始化为1。

最后,再遍历一遍字典,找到出现次数最多的元素即可。

代码实现
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

int find_mode(int* nums, int numsSize){

    // 定义一个字典(哈希表)
    int dict[numsSize][2];

    // 初始化字典
    for(int i=0;i<numsSize;i++){
        dict[i][0]=0;  // 记录元素
        dict[i][1]=0;  // 记录元素出现的次数
    }

    int index=0;
    for(int i=0;i<numsSize;i++){
        bool flag=false;   // 标记该元素是否出现过
        for(int j=0;j<numsSize;j++){
            if(dict[j][0]==0){  // 元素未被记录
                dict[j][0]=nums[i];
                dict[j][1]=1;
                flag=true;
                break;
            }
            else if(dict[j][0]==nums[i]){  // 元素已被记录
                dict[j][1]++;
                flag=true;
                break;
            }
        }
        if(!flag){   // 字典已满且该元素未被记录
            dict[index][0]=nums[i];
            dict[index][1]=1;
            index++;
        }
    }

    // 找到出现次数最多的元素
    int max_num=0, max_cnt=0;
    for(int i=0;i<numsSize;i++){
        if(dict[i][0]==0){  // 元素未被记录
            break;
        }
        if(dict[i][1]>max_cnt){
            max_cnt=dict[i][1];
            max_num=dict[i][0];
        }
    }

    // 判断是否存在众数
    if(max_cnt<=numsSize/2){
        return 0;
    }
    else{
        return max_num;
    }
}

int main(){
    int nums[]={1,2,3,2,2};
    int result=find_mode(nums,5);
    printf("%d\n",result);
    return 0;
}
总结

本题是一道比较简单的算法题,主要考察对哈希表的掌握程度和代码实现能力。在具体实现时,需要注意一些细节问题,比如在初始化字典时,需要设置元素的初始值为0,而不是随意一个数;再比如,我们需要判断是否存在众数,以避免在不存在众数的情况下返回错误结果。