目录
4.4.1 四个随机数中的次大值
4.4.2 计算次大值的算法思路
4.4.3 使用循环计算次大值
4.4.4 祝祖国繁荣昌盛
4.4.1 四个随机数中的次大值
假设有四个整型变量,它们值的大小未知,该怎么计算出四个中的次大值?
次大值即第二大的数。初学者解出这道题并不困难,但是将代码写得简洁优雅却是一个不小的挑战
4.4.2 计算次大值的算法思路
直接通过if来逐一比较,穷举所有的情况,这样的思路能够把次大值找出来,但最终写出的只是一坨又长又臭的代码。比较好的思路是先计算三个变量中的最大值以及中值,将其大小关系确定下来:
然后将第四个变量分别与最大值,中值进行比较,如果比三个中的最大值要大,那么次大值肯定就是三个中的最大值,如果比最大值小但比中值要大,那么次大值肯定就是第四个值。否则次大值一定是三个中的中值,为什么呢?因为次大值一定不是三个中的最小值,所以只能是三个中的中值。
先将三个变量的大小关系确定下来,这样就可以减少诸多无用的判断
代码实例:
"""
@author: 大神薯条老师
@desc: 计算四个随机数中的次大值
"""
import random
# random是Python中的一个内置的随机数模块
# random.randint用来构造一个在指定区间内的随机整数
x = random.randint(0, 1000)
y = random.randint(0, 1000)
z = random.randint(0, 1000)
k = random.randint(0, 1000)
# 调用max函数计算三个中的最大值
max_ = max(x, y, z)
# 调用min函数计算三个中的最小值
min_ = min(x, y, z)
# 将三个变量相加再减去最大值和最小值,结果一定是中值
median = x+y+z-max_-min_
# 假设四个中的k为次大值
max_k2 = k
if k > max_:
# k, 大,中,小
# 比三个中的最大值max_要大,次大值就是max_
max_k2 = max_
elif k < median:
# 大,中,k,小或大,中,小, k
# 比三个中的median小,那么次大值就是median
max_k2 = median
print(f"x={x},y={y},z={z},k={k} 次大值:{max_k2}")
4.4.3 使用循环计算次大值
在for循环中计算最大值的逻辑很简单,如果需要计算出次大值,又该怎么实现呢?
许多初学者将这个问题想得过于复杂,要学会将复杂的问题简化处理,这样才能更好地理解事物的本质。
可将问题简化为循环只迭代两次:如果第一次迭代出来的值比最大值要大,那么就更新为最大值。如果第二次迭代出来的比最大值要大,那么此时的次大值就一定是上一次的最大值。
在实现的过程中,需要注意对最大值和次大值初始化时,二者刚好为最大值的特殊情况。
代码实例:
"""
@author: 大神薯条老师
@desc: 使用循环结构计算出次大值
"""
# 在Python中,[]括起来的叫做列表
numbers = [9, 9, 5, 7, 3]
# max_表示最大值,max_k2表示次大值
# 假设列表中的第一个是最大值,第二个是次大值
max_, max_k2 = numbers[0], numbers[1]
# 用for循环迭代列表等可迭代对象,列表,元组等后面会详细讲解
for number in numbers[1:]: # 表示从列表的第2个元素开始迭代
if number > max_:
# 如果迭代出来的值比max_要大,那么次大值一定是上次的最大值
max_k2 = max_
# 当前的number就变成了最大值
max_ = number
elif max_ > number > max_k2:
# 如果迭代出来的比max_要小,但比次大值大,那么次大值就为当前迭代出来的number
max_k2 = number
elif max_ == max_k2:
# 如果max_与max_k2刚好为最大值,且相等,就将次大值更新为当前迭代出来的number
max_k2 = number
else:
print(f"最大值:{max}, 次大值:{max_k2}")
4.4.4 祝祖国繁荣昌盛
跟薯条老师学后端开发,高级爬虫(JS逆向+安卓逆向),数据分析,大数据开发,量化交易,以及机器学习+深度学习算法。坚定自己的学习目标,保持学习的热情,那你成为高手只是时间问题。
薯条老师的学生在南方电网,林氏家居,京东,阿里等大厂。想系统学习Python和Java的同学,可以移步薯条老师的个人技术博客:薯条老师的个人技术博客http://www.chipscoco.com/ 对本节教程有任何不懂的同学,亦可在评论区中进行评论。薯条老师会详细解答你们提出的每一个问题。