Python实现数组增减拐点索引查找函数的代码问题排查
数组拐点查找函数实现
需求回顾
实现接收数字数组作为入参的Python函数,返回数组中趋势反转的位置索引:即数值停止递增转为递减、或是停止递减转为递增的位置。例如传入数组[1, 2, 4, 6, 4, 3, 1]时,预期返回索引值3。
现有代码问题排查
你当前编写的代码如下:
def ArrayChallenge(arr): for i in range(len(arr)): if arr[i] > arr[i+1]: return i
代码存在3个核心问题:
- 索引越界:循环遍历到数组最后一个元素时,
arr[i+1]会访问不存在的数组下标,直接触发索引越界错误,你看到的仅返回左括号的异常,是运行环境对报错信息截断显示的结果。 - 逻辑不全:仅判断了递增转递减的场景,没有覆盖递减转递增的拐点识别,也没有提前判断数组初始趋势,遇到先降后升的数组会返回错误结果。
- 边界缺失:没有处理数组长度不足3(不存在拐点)、连续相等元素、全程单调无反转等边界场景。
正确实现代码
实现逻辑:
- 先做长度校验,数组长度小于3时直接返回-1(无有效拐点)
- 跳过开头连续相等的元素,确定数组初始趋势是递增还是递减
- 从趋势确定位置向后遍历,一旦检测到趋势和初始趋势相反,立刻返回当前拐点索引
- 遍历完成后如果没有发现反转,返回-1
def ArrayChallenge(arr): arr_len = len(arr) # 数组长度不足3,不存在拐点 if arr_len < 3: return -1 # 跳过开头连续相等的元素,定位趋势起点 pos = 0 while pos < arr_len - 1 and arr[pos] == arr[pos + 1]: pos += 1 # 所有元素都相等,无拐点 if pos == arr_len - 1: return -1 # 标记初始趋势:True为递增,False为递减 is_rising = arr[pos] < arr[pos + 1] # 遍历查找趋势反转点 for i in range(pos + 1, arr_len - 1): current_trend = arr[i] < arr[i + 1] if current_trend != is_rising: return i # 全程单调无反转 return -1
测试用例验证
- 传入
[1, 2, 4, 6, 4, 3, 1],返回3,符合预期 - 传入
[7, 5, 3, 2, 4, 6, 8](递减转递增场景),返回3 - 传入
[1, 3, 5, 7, 9](全程递增无反转),返回-1 - 传入
[9, 7, 5, 3, 1](全程递减无反转),返回-1 - 传入
[2, 2, 2, 3, 5, 4](开头存在连续相等元素),返回4
内容的提问来源于stack exchange,提问作者user360044
相关产品推荐
相关产品推荐

