Python入门习题(25)——CCF CSP认证考试真题:小中大

〖题目背景〗
在数据分析中,最小值、最大值以及中位数是常用的统计信息。
〖题目描述〗
老师给了你n个整数组成的测量数据,保证有序(可能为升序或降序),可能存在重复的数据。请统计出这组测量数据中的最大值、中位数以及最小值,并按照从大到小的顺序输出这三个数。
〖输入格式〗
从标准输入读入数据。
第一行输入一个整数n,在第二行中存在n个有序的整数,表示测量数据,可能为升序或降序排列,可能存在连续多个整数相等,整数与整数之间使用空格隔开。
〖输出格式〗
输出到标准输出。
包含一行,包括最大值、中位数以及最小值共三个数,并按照从大到小的顺序输出。数据与数据之间用空格隔开。对于整数请直接输出整数,对于可能出现的分数,请输出些舍五入保留1位小数的结果。
〖样例1输入〗
3
-1 2 4
〖样例1输出〗
4 2 -1
〖样例1解释〗
4为最大值,2为中位数,一1为最小值。
〖样例2输入〗
4
-2 -1 3 4
〖样例2输出〗
4 1 -1
〖样例2解释〗
4为最大值,(-1+3)÷2=1为中位数,-2为最小值。

解题思路

  1. 求出n个整数中的最大值和最小值。无论是从小到大排序还是从大到小排序,最大值和最小值总是在第一个和最后一个。先假定最大值处于第一个,最小值在最后一个。如果最大值小于最小值,那么调换它们。
  2. 中位数与排序顺序无关。
  3. 中位数与n的奇偶性有关。如果n为奇数,那么整数序列nums中下标为 n / 2 \lfloor n/2 \rfloor 的元素正是中位数。如果n为偶数,那么中位数是(nums[ n / 2 \lfloor n/2 \rfloor ] + nums[ n / 2 \lfloor n/2 \rfloor - 1] ) / 2。下标从0开始。
  4. 需要注意的细节是,如果(nums[ n / 2 \lfloor n/2 \rfloor ] + nums[ n / 2 \lfloor n/2 \rfloor - 1] ) / 2的结果是小数,那么输出要保留小数1位。

参考答案

n = int(input())
nums = [int(s) for s in input().split()]
#求最大值、最小值
maxnum = nums[0]
minnum = nums[-1]
if maxnum < minnum:
    maxnum, minnum = minnum, maxnum
print(maxnum, end=' ')  #输出最大值
#求中位数并输出
if len(nums) % 2 == 1:
    mid = nums[len(nums) // 2]
    print(mid, end=' ')
else:
    mid_2_sum = nums[len(nums) // 2] + nums[len(nums) // 2 - 1]
    if mid_2_sum % 2 == 0:  
        print(mid_2_sum // 2, end = ' ')  #中位数是整数
    else: 
        print("%.1f"%(mid_2_sum / 2), end=' ')   #中位数是小数

print(minnum)  #输出最小值

测试用例

题目描述中给出的2个测试用例(即2组样例输入和输出样例),已经覆盖了以下情形:

  1. n>2, n为奇数,从小到大排序,中位数是整数。
  2. n>2, n为偶数,从小到大排序,中位数是整数。

n的奇偶性,排序顺序以及中位数是否为小数这3个因素会影响计算过程,但彼此之间没有关联,所以无需构造两两组合的情形。n个整数中有重复的数,这一点与计算无关,无需测试。下面给出的测试用例覆盖了其他情形。

  1. n = 1的情形。目的是测试数组长度的边界值。题目描述中没指出n>1,所以有必要。
    样例输入
    1
    3
    样例输出
    3 3 3
  2. n = 2的情形 。目的是测试数组长度的边界值。
    样例输入
    2
    -1 3
    样例输出
    3 1 -1
  3. 从大到小排序的情形。
    样例输入
    4
    4 3 -1 -2
    样例输出
    4 1 -2
  4. 中位数是小数的情形。
    样例输入
    4
    4 3 2 -1
    样例输出
    4 2.5 -1

由于python中,nums[-1]表示的是nums列表中的最后一个元素,因此本节给出的第一个测试用例能够成功通过。

小结

  1. 解答本题要注意多项细节。
    (1) 排序可能是从小到大,也可能是从大到小。
    (2) 中位数的计算与n的奇偶性相关。
    (3) 中位数是整数的话,采用整除操作;是小数的话,采用浮点数除法操作。而且,两种情形的输出格式不同。
    (4) n等于1,或等于2的话,要特别考虑。
发布了85 篇原创文章 · 获赞 86 · 访问量 31万+

猜你喜欢

转载自blog.csdn.net/yedouble/article/details/104086034