You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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(不存在拐点)、连续相等元素、全程单调无反转等边界场景。

正确实现代码

实现逻辑:

  1. 先做长度校验,数组长度小于3时直接返回-1(无有效拐点)
  2. 跳过开头连续相等的元素,确定数组初始趋势是递增还是递减
  3. 从趋势确定位置向后遍历,一旦检测到趋势和初始趋势相反,立刻返回当前拐点索引
  4. 遍历完成后如果没有发现反转,返回-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 20:18:30