自学内容网 自学内容网

Python从入门到高手4.4节-算法实战之计算次大值

目录

4.4.1 四个随机数中的次大值

4.4.2 计算次大值的算法思路

4.4.3 使用循环计算次大值

4.4.4 祝祖国繁荣昌盛


4.4.1 四个随机数中的次大值

假设有四个整型变量,它们值的大小未知,该怎么计算出四个中的次大值?

图片.png

次大值即第二大的数。初学者解出这道题并不困难,但是将代码写得简洁优雅却是一个不小的挑战

4.4.2 计算次大值的算法思路

直接通过if来逐一比较,穷举所有的情况,这样的思路能够把次大值找出来,但最终写出的只是一坨又长又臭的代码。比较好的思路是先计算三个变量中的最大值以及中值,将其大小关系确定下来:

图片.png

然后将第四个变量分别与最大值,中值进行比较,如果比三个中的最大值要大,那么次大值肯定就是三个中的最大值,如果比最大值小但比中值要大,那么次大值肯定就是第四个值。否则次大值一定是三个中的中值,为什么呢?因为次大值一定不是三个中的最小值,所以只能是三个中的中值。

先将三个变量的大小关系确定下来,这样就可以减少诸多无用的判断

代码实例:

"""
@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/ 对本节教程有任何不懂的同学,亦可在评论区中进行评论。薯条老师会详细解答你们提出的每一个问题。


原文地址:https://blog.csdn.net/thereisadownloader/article/details/142701733

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!