练习:寻找峰值(代码要“望文知义”才和谐)



查找峰值


  CSDN“每日一练” (python) 题目。

  1. 题目
  2. 断点调试
  3. 不符题另解
  4. 完整代码

练习题目


在这里插入图片描述

题目原答案

在这里插入图片描述

  我把代码都读得能默写出了,还是不能明白 mid = int(…) 那行代码。🧐🧐

默写代码

def find_high(nums):
    '''寻找峰值'''
    low = 0
    high = len(nums)-1
    while low < high:
        input(f'\nlow>>{low},high>>{high}\nlow - (low - high) / 2 = {low - (low - high) / 2}')
        mid = int(low - (low - high) / 2)
        if nums[mid] < nums[mid + 1]:
            low = mid + 1
        else:
            high = mid
    return low


nums = [1, 2, 3, 1], [1, 2, 1, 3, 5, 6, 4]
for i in nums:
    print(f'\n\n\n{"寻找峰值":_^38}\n\n\n{"整数数组:":>12}{i}\n\n{"峰值元素下标:":>16}{find_high(i)}\n\n\n{"The End":_^42}\n')
input('Any key continue ...'.center(42))

   low - (low - high) / 2
= 2 * low /2 - (low - high) / 2
= (2 * low - low + high) / 2
= (low + high) / 2

  我当数学四则运算化简,还是看不明白。
mid = int((low + high) / 2)
  替换化简后表达式,一样能得结果输出。

在这里插入图片描述


回首页

  用 input() 设置断点调试,观其查找峰值详情。

在这里插入图片描述

在这里插入图片描述

  通过这阵子折腾,我终于明白,这个表达式是在求未查找元素的中间位置元素下标。但从表达式,不能“明”其意知其“性”。😌😌

mid = int(left + (right - left) / 2) #求未查找过元素中间位置下标。
  我用我能懂得起的“语言”改了那行表达式代码。

在这里插入图片描述

   Python 代码:

def find_high(nums):
    '''寻找峰值'''
    left = 0 #初始化峰值左边元素为第一个下标。
    right = high = len(nums)-1 #初始化峰值元素和峰值右侧元素为最后一个下标。
    while left < right: #峰值元素左边下标小于右边下标,循环查找峰值元素下标。
        mid = int(left + (right - left) / 2) #求未查找过元素中间位置下标。
        if nums[mid] < nums[mid + 1]:
            high = left = mid + 1 #中间位置下标元素小于中间位置右侧一位下标元素,峰值元素下标和峰值元素左侧元素,下标 + 1。
        else:
            right = mid #未查找元素中间位置元素大于右侧一位元素,峰值元素右侧元素下标等于中间位置元素下标。
        print(f'\nLeft:{left},Mid:{mid},Right:{right}')
    return high #返回峰值元素下标。


nums = [1, 2, 3, 1], [1, 2, 1, 3, 5, 6, 4]
for i in nums:
    print(f'\n\n\n{"寻找峰值":_^38}\n\n\n{"整数数组:":>12}{i}\n\n{"峰值元素下标:":>16}{find_high(i)}\n\n\n{"The End":_^42}\n')
input('Any key continue ...'.center(42))
  修改变量名和表达式后,个人认为可以“望文知义”了。

在这里插入图片描述


回首页

  不考虑题目限制,只实现题目输出,也可以用枚举遍历只需一行代码。

for k, i in enumerate(nums[:len(nums)-1]): for k, i in enumerate(nums[:len(nums)-1]): if i > nums[k - 1] and i > nums[k + 1]: print(k)

在这里插入图片描述

在这里插入图片描述


回首页

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

#不符题另解
def find_high(nums):
    '''寻找峰值'''
    for k, i in enumerate(nums[:len(nums)-1]): #枚举遍历 nums 副本(不含最后一个元素——防止 k + 1 下标溢出)。
        input(f'\n当前下标:{k}\n{"当前元素同时大于前后元素":_^30}\ni > nums[k - 1] and i > nums[k + 1]:{i > nums[k - 1] and i > nums[k + 1]}\n')
        if i > nums[k - 1] and i > nums[k + 1]:
            return k #当前元素同时大于前后元素,即是峰值,返回其下标。


nums = [1, 2, 3, 1], [1, 2, 1, 3, 5, 6, 4]
for i in nums:
    print(f'\n\n\n{"寻找峰值":_^38}\n\n\n{"整数数组:":>12}{i}\n\n{"峰值元素下标:":>16}{find_high(i)}\n\n\n{"The End":_^42}\n')
input('Any key continue ...'.center(42))

#改变量名,换表达式
def find_high(nums):
    '''寻找峰值'''
    left = 0 #初始化峰值左边元素为第一个下标。
    right = high = len(nums)-1 #初始化峰值元素和峰值右侧元素为最后一个下标。
    while left < right: #峰值元素左边下标小于右边下标,循环查找峰值元素下标。
        mid = int(left + (right - left) / 2) #求未查找过元素中间位置下标。
        if nums[mid] < nums[mid + 1]:
            high = left = mid + 1 #中间位置下标元素小于中间位置右侧一位下标元素,峰值元素下标和峰值元素左侧元素,下标 + 1。
        else:
            right = mid #未查找元素中间位置元素大于右侧一位元素,峰值元素右侧元素下标等于中间位置元素下标。
        print(f'\nLeft:{left},Mid:{mid},Right:{right}')
    return high #返回峰值元素下标。


nums = [1, 2, 3, 1], [1, 2, 1, 3, 5, 6, 4]
for i in nums:
    print(f'\n\n\n{"寻找峰值":_^38}\n\n\n{"整数数组:":>12}{i}\n\n{"峰值元素下标:":>16}{find_high(i)}\n\n\n{"The End":_^42}\n')
input('Any key continue ...'.center(42))



#默写代码(原题答案)
def find_high(nums):
    '''寻找峰值'''
    low = 0
    high = len(nums)-1
    while low < high:
        input(f'\nlow>>{low},high>>{high}\nlow - (low - high) / 2 = {low - (low - high) / 2}')
        mid = int(low - (low - high) / 2)
        if nums[mid] < nums[mid + 1]:
            low = mid + 1
        else:
            high = mid
    return low


nums = [1, 2, 3, 1], [1, 2, 1, 3, 5, 6, 4]
for i in nums:
    print(f'\n\n\n{"寻找峰值":_^38}\n\n\n{"整数数组:":>12}{i}\n\n{"峰值元素下标:":>16}{find_high(i)}\n\n\n{"The End":_^42}\n')
input('Any key continue ...'.center(42))


#用数字方法化简表达式
def find_high(nums):
    '''寻找峰值'''
    low = 0
    high = len(nums)-1
    while low < high:
        mid = int((low + high) / 2)
        if nums[mid] < nums[mid + 1]:
            low = mid + 1
        else:
            high = mid
    return low


nums = [1, 2, 3, 1], [1, 2, 1, 3, 5, 6, 4]
for i in nums:
    print(f'\n\n\n{"寻找峰值":_^38}\n\n\n{"整数数组:":>12}{i}\n\n{"峰值元素下标:":>16}{find_high(i)}\n\n\n{"The End":_^42}\n')

回首页

我的HOT博:

推荐条件 点阅破千

参考文章:


上一篇:练习:移除元素
下一篇:练习:多数元素


好文力荐:靠谱程序员的好习惯

回首页

老齐漫画头像

精品文章:

来源:老齐教室


CSDN实用技巧博文:


  • 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、付费专栏及课程。

余额充值