题目来自于博主算法大师的专栏:最新华为OD机试C卷+AB卷+OJ(C++JavaJSPy) https://blog.csdn.net/banxia_frontend/category_12225173.html
题目
众数是指一组数据中出现次数多的数
众数可以是多个
中位数是指把一组数据从小到大排列,最中间的那个数,
如果这组数据的个数是奇数,那最中间那个就是中位数
如果这组数据的个数为偶数,那就把中间的两个数之和除以 2 就是中位数
查找整型数组中元素的众数并组成一个新的数组
求新数组的中位数
输入
输入一个一维整型数组,数组大小取值范围 0 < n < 1000
数组中每个元素取值范围, 0 < e < 1000
输出
输出众数组成的新数组的中位数
示例一
输入
10 11 21 19 21 17 21 16 21 18 16
输出
21
众数组成的新数组:21
众数组成的新数组的中位数:21
示例二
输入
2 1 5 4 3 3 9 2 7 4 6 2 15 4 2 4
输出
3
众数组成的新数组:2 4
众数组成的新数组的中位数:3
示例三
输入
5 1 5 3 5 2 5 5 7 6 7 3 7 11 7 55 7 9 98 9 17 9 15 9 9 1 39
输出
7
众数组成的新数组:5 7 9
众数组成的新数组的中位数:7
代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX_INTS 100
void solveMethod(char *line){
int tmp;
int arr[MAX_INTS]={0};//c语言中 适用于静态数组
char *token=strtok(line," ");
//token是一个指向字符类型的指针变量。它并不直接存储字符,而是存储一个地址,该地址指向一个字符或一串字符(即字符串)的第一个字符的内存位置。
//处理字符串 ,读取一行以空格分隔的整数。
while(token!=NULL){
sscanf(token,"%d",&tmp);//告诉函数将读取到的整数值存储到 tmp 变量所在的内存位置。修改变量 tmp 的值
arr[tmp]++;
token=strtok(NULL," ");//传递的是 NULL,则意味着 strtok() 应该从上次调用的位置继续分割
}
//统计数字出现频率:
int max=0;
for(int i=0;i<MAX_INTS;++i){
if(arr[i]>max){
max=arr[i];//计算arr中的元素出现最多出现多少次
}
}
//找出出现频率最高的数字并存入新数组:
int newarr[MAX_INTS]={0};
int j=0;
for(int i=0;i<MAX_INTS;++i){
if(arr[i]==max){//出现次数最多的几个数
newarr[j++]=i;//newArr是包含众数的数列 (递增有序)
}
}
//计算中位数:
int size=j;
int res=0;
if(size%2==0){
res=(newarr[size/2]+newarr[size/2-1])/2;
}
else{
res=newarr[size/2];
}
printf("%d\n",res);
}
int main(){
char line[1000];
fgets(line,1000,stdin);//用于从指定的文件流(如标准输入 stdin)读取一行文本数据并存入缓冲区。
line[strcspn(line,"\n")]=0;//从用户输入的一行文本中删除末尾的换行符。将换行符赋值为 0,即空字符
solveMethod(line);
return 0;
}
运行结果:
解释
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
- 这些行包含了标准输入输出库(stdio.h)、标准库(stdlib.h)和字符串处理库(string.h),它们提供了用于输入输出、内存分配、字符串操作等功能的函数。
#define MAX_INTS 100
- 这定义了一个常量
MAX_INTS
,表示数组的最大大小为 100。函数内部的代码:
统计数字出现频率:
- 创建一个整数数组
arr
来存储每个数字出现的次数。- 使用
strtok
函数将输入字符串line
分割成以空格分隔的数字。- 遍历每个数字:
- 使用
sscanf
函数将字符串转换为整数。- 将对应数字在
arr
数组中的计数加 1。找出出现频率最高的数字并存入新数组:
- 找到
arr
数组中的最大值max
,代表出现频率最高的数字。- 创建一个新的数组
newarr
来存储出现频率最高的数字。- 遍历
arr
数组,将出现频率为max
的数字存入newarr
数组。计算中位数:
- 如果
newarr
数组中的元素个数为偶数,则中位数为中间两个元素的平均值。- 如果
newarr
数组中的元素个数为奇数,则中位数为中间元素的值。- 计算出中位数并存入
res
变量中。打印中位数:
- 使用
printf
函数打印res
变量的值,即中位数。主函数main:
读取输入字符串:
- 声明一个字符串
line
来存储输入的数字。- 使用
fgets
函数从标准输入中读取一行字符串并存入line
变量中。- 使用
strcspn
函数去除line
字符串末尾的换行符。调用函数并返回:
- 调用
solveMethod
函数来处理输入字符串line
并计算中位数。- 返回 0 表示程序正常退出。
总结一下,这个程序的作用是:
- 读取一行以空格分隔的整数。
- 统计每个数字出现的频率。
- 找出出现频率最高的数字。
- 计算这些数字的中位数。
- 打印中位数。