查找峰值
CSDN“每日一练” (python) 题目。
练习题目
题目原答案
我把代码都读得能默写出了,还是不能明白 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博:
- New:练习:快乐数判断(当前阅读1040)
- New:罗马数字转换器(构造元素取模实现)(当前阅读1192)
- 罗马数字转换器|罗马数字生成器(当前阅读1416)
- Hot让QQ群昵称色变的神奇代码(当前阅读2325)
- 斐波那契数列(递归实现和for实现)(当前阅读1900)
- 排序数组中查找元素的重复起止位置(当前阅读1205)
- 柱状图中最大矩形(当前阅读1608)
- 电话拨号键盘的字母组合(当前阅读1227)
- 密码强度检测器(当前阅读1671)
- 求列表平衡点(当前阅读1750)
- 字符串统计(当前阅读2141)
- 尼姆游戏(代码优化版)(当前阅读826)
- Hot:尼姆游戏(聪明版首发)(当前阅读3248)
推荐条件
点阅破千
参考文章:
好文力荐:靠谱程序员的好习惯
精品文章:
- OPP三大特性:封装中的property
- 通过内置对象理解python'
- 正则表达式
- python中“*”的作用
- Python 完全自学手册
- 海象运算符
- Python中的 `!=`与`is not`不同
- 学习编程的正确方法
来源:老齐教室