练习:盛水最多的容器(enumerate枚举函数实例)



盛最多水的容器


  1. 练习题目
  2. 代码运行效果
  3. 设计的算法有缺陷
  4. 修改后的“完美”代码

练习题目

在这里插入图片描述

   求盛最多水的容器,实则是计算数列坐标能围成的最大矩形面积。

回首页

代码运行效果

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


回首页

python完整代码(算法有缺陷)
(如果从语句注释不能清楚作用,请评论区留言指教和探讨。🤝)
#/usr/bin/nve python
# coding: utf-8
import os


def clear():
    '''Linux清屏'''
    l = os.system('clear')


def sum_max(nums):
    '''计算数列坐标能围成的最大矩形面积'''
    #max_n = 0 #初始化数列最大值
    #for i in nums: #找出数列中最大值并记录位置
        #if i>max_n:
            #max_n = i
            #index = nums.index(i)
    #被注释掉的前面五行代码与后两行代码等效,可以依个人喜欢选用。
    max_n = max(nums)
    index = nums.index(max_n)
    max_s = 0 #初始化最大面积
    for i in range(len(nums)):
        s = abs(i-index)*nums[i]
        if s>max_s:
            max_s = s
    return max_s


#main codes
nums = [
[1, 8, 6, 2, 5, 4, 8, 3, 7],
[1, 1],
[4, 3, 2, 1, 4],
[1, 2, 1],
[1, 1, 6, 9, 8],
[4, 7, 9, 4, 6, 9, 8, 3, 8]
        ] #定义输入数列
line = '﹊'*21 #一条插值字符串格式化语句定制输出最后结果变量
line0 = '\n'*6
for i in nums:
    result = sum_max(i)
    clear()
    input(f'{line0}\n输入数列:{i}\n{line}\n    最大盛水容器:{result}\n{line}\n')
  后三个数组的结果,都是错误的。显然,我设计的先找到最大元素,再遍历最大矩形面积的算法是有误区的。

回首页

  修改算法。不再“投机取巧”,老实地依次全部遍历出最大面积。代码用python内置函数enumerate枚举同时获取元素的位置和值精简,颜值加分不少。😋😋

修改后的算法代码

    #遍历列表所有元素两两构成的最大矩形面积,找出最大值
    for i, j in enumerate(nums): #枚举内置函数enumerate()同时获取元素位置和元素值。
        for m, n in enumerate(nums):
            min = j
            if j>n:
                min =n
            s = abs(i-m)*min
            if s>max_s:
                max_s = s

代码运行效果

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

   这才是正确的结果咯。🤓🤓🤓

python完整代码
(如果从语句注释不能清楚作用,请评论区留言指教和探讨。🤝)
#/usr/bin/nve python
# coding: utf-8
import os


def clear():
    '''Linux清屏'''
    l = os.system('clear')


def sum_max(nums):
    '''计算数列坐标能围成的最大矩形面积'''
    max_s = 0 #初始化最大面积
    #遍历列表所有元素两两构成的最大矩形面积,找出最大值
    for i, j in enumerate(nums): #枚举内置函数enumerate()同时获取元素位置和元素值。
        for m, n in enumerate(nums):
            min = j
            if j>n:
                min =n
            s = abs(i-m)*min
            if s>max_s:
                max_s = s
    return max_s


#main codes
nums = [
[1, 8, 6, 2, 5, 4, 8, 3, 7],
[1, 1],
[4, 3, 2, 1, 4],
[1, 2, 1],
[1, 1, 6, 9, 8],
[4, 7, 9, 4, 6, 9, 8, 3, 8]
        ] #定义输入数列
line = '﹊'*21 #一条插值字符串格式化语句定制输出最后结果变量
line0 = '\n'*6
for i in nums:
    result = sum_max(i)
    clear()
    input(f'{line0}\n输入数列:{i}\n{line}\n    最大盛水容器:{result}\n{line}\n')

回首页

我的博文推荐:

    • 0
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 打赏
      打赏
    • 0
      评论
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    梦幻精灵_cq

    你的鼓励将是我创作的最大动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

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

    余额充值