【CCF-CSP】 201612-1 中间数


一、题目

在这里插入图片描述

原题目链接

二、解题

1.题目

这是一个解决“寻找中位数”问题的代码。给定一个长度为 N(N为奇数)的数组,代码会输出这个数组的中位数。

代码思路:首先使用计数排序对数组进行预处理(记录每个数出现的次数),然后从小到大枚举每一个数,找到第一个出现次数与中位数相加不小于总数一半的数,最后判断该数的出现次数是否恰好等于中位数。如果是,则输出该数,否则输出-1。

2.代码

dev c++ 5.11

#include<iostream>
#include<cstring>
using namespace std;
int valcount[1010];
int main(){
    int n;
    cin>>n;
    int val;
    memset(valcount,0,sizeof(valcount));
    for(int i=0;i<n;i++){
        cin>>val;
        valcount[val]++;
    }
    int ans,mid=(n+1)/2,count=0,left;
    for(int i=0;i<=1010;i++){
        if(count+valcount[i]>=mid){
           left=count;
           count=0;
           ans=i;
        }else{
              count+=valcount[i];
        }
    }
    if(left==count){
       cout<<ans<<endl;
    }else{
          cout<<-1<<endl;
    }
    
    return 0;
}



3.提交结果

在这里插入图片描述

总结

  1. 代码详细思路。
    找到给定数字序列中的中位数,如果没有中位数则输出 -1。下面是代码的详细思路:

  2. 首先,从标准输入获得数字序列的长度 n,然后在读取一个整数作为输入值 val。

  3. 声明一个大小为 1010 的数组 valcount, 数组用处是统计每个数字出现的次数。

  4. 遍历长度为 n 的数字序列,并将数字出现的次数累加到 valcount 数组中。

  5. 如果数字序列的长度为奇数,则中位数为第 (n+1)/2 个数字。如果数字序列的长度为偶数,则中位数为第 n/2 个数字和第 n/2+1 个数字的平均值。

  6. 遍历从 0 到 1010 的数字,逐一查找累加数字出现次数,直到 count+valcount[i]>=mid。在这一点上,计算中位数应该在值 i 中。数字 i 是中位数的候选值。

  7. 如果在遍历数组时存在两个相邻的数字之间没有数字,使 count < mid < count + valcount [i +1]。那么最后再检查这个区间之前的数字。这个区间内的数字不能是中位数。只有当遍历完所有的数字,左右两边的数字数量相同时,中位数候选值才是中位数,输出中位数的值。如果左右两边的数字数量不同,所以没有中位数,输出 -1。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值