📅  最后修改于: 2023-12-03 15:30:15.356000             🧑  作者: Mango
本题要求编写一个函数,接收一个整形数组和数组长度作为参数,返回该数组的众数。如果数组没有众数,则返回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,而不是随意一个数;再比如,我们需要判断是否存在众数,以避免在不存在众数的情况下返回错误结果。