ccf csp 201612-1中间数(python)

历年题解 CCF CSP历年题解(python)

在这里插入图片描述

样例输入:

6
2 6 5 6 3 5

4
3 4 6 7

5
3 4 6 6 7

题目链接:201612-1中间数

问题分析: 对数进行排序,若n为奇数且存在中间数,则中位数即为中间数,若为偶数且存在中间数,则中间两个数一定相同且为中间数

满分例程:
1.最优解:

n=int(input())
l=list(map(int,input().split()))
l.sort()
middle=int(n/2)
mi=0
ma=0
for i in range(n):
    if l[i]<l[middle]:
        mi+=1
    elif l[i]>l[middle]:
        ma+=1
if mi==ma:
    print(l[middle])
else:
    print(-1)

2.另一种做法:遍历列表,计算每个数再列表中对应大于和小于它的个数,若大于与小于的个数相等,即为中位数

n = int(input())
a = list(map(input().split()))
bo = 0
for i in range(n):
    ma = 0
    mi = 0
    for j in range(n):
        if a[i] > a[j]:
            ma += 1
        elif a[i] < a[j]:
            mi += 1
    if ma == mi:
        bo = 1
        break
if bo == 1:
    print(a[i])
elif bo == 0:
    print('-1')

3.另一种做法 [ 80分 ] :建立一个字典{数:数的个数},按数排序,stat为从左开始的索引,low为小于中位数的计数,fi为从右开始的索引,high为大于中位数的计数,循环n-2次,左右两边逐渐向中靠近
该程序使用字典相比于2降低了空间复杂度,时间复杂度就是stored的O(nlogn),比2也低,但模拟80分,朋友们发现错误可以留言,多谢

n=int(input())
l=list(map(int,input().split()))
s={}
for i in range(len(l)):
    if l[i] not in s:
        s[l[i]]=1
    else:
        s[l[i]]+=1

k=sorted(s.keys())
stat = 1
fi = 0
low=s[k[0]]
high=0
for i in range(1,len(k)-1):
    if low>=high:
        high+=s[k[len(k)-fi-1]]
        fi+=1
    else:
        low+=s[k[stat]]
        stat+=1
if low==high:
    print(k[stat])
else:
    print(-1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值