判断数组是否先严格递增后严格递减,代码索引越界如何解决
问题解答
1. IndexError错误原因
你收到的错误提示索引错误:列表索引超出范围,触发原因如下:
你的循环变量i遍历的是range(len(arr)),取值范围是0 ~ len(arr)-1。当i取到最大值len(arr)-1时,代码中访问了arr[i+1],也就是arr[len(arr)],但Python列表的合法索引范围是0 ~ len(arr)-1,这个位置不存在,因此触发越界错误。
如果要比较相邻元素,循环范围需要修改为range(len(arr)-1),此时i的最大值是len(arr)-2,i+1不会超出合法索引范围。
2. for循环中的i不需要手动递增
Python的for i in range(xxx)写法会自动在每次迭代完成后给i递增加1,不需要你手动编写i += 1这类逻辑,手动递增反而会导致部分索引被跳过,逻辑出错。
3. 原有代码逻辑问题
你当前的代码逻辑完全不符合任务要求:每一轮比较相邻元素就直接输出YES/NO,会输出多个结果,也没有实现「先严格递增、后严格递减」的判断逻辑。
正确的判断逻辑如下:
- 首先数组长度至少为3,否则不可能同时存在递增段和递减段
- 先从左向右遍历,找到峰值点(第一个不再满足严格递增的位置)
- 峰值点不能在数组第一个位置(没有递增段),也不能在数组最后一个位置(没有递减段)
- 再从峰值点向右遍历,判断后续所有元素是否满足严格递减
- 上述条件全部满足则输出YES,否则输出NO
正确代码示例
def checkType(arr, n): # 长度小于3直接不满足 if n < 3: print("NO") return # 找峰值 i = 0 # 递增阶段 while i < n-1 and arr[i] < arr[i+1]: i += 1 # 峰值在开头或结尾,不满足 if i == 0 or i == n-1: print("NO") return # 递减阶段 while i < n-1 and arr[i] > arr[i+1]: i += 1 # 走到末尾说明递减也满足 print("YES" if i == n-1 else "NO") if __name__ == "__main__" : arr1 = [-3, 9, 11, 20, 17, 5, 1] checkType(arr1, len(arr1)) # 输出YES arr2 = [5, 6, 7, 8, 9, 10, 1, 2, 11] checkType(arr2, len(arr2)) # 输出NO
内容的提问来源于stack exchange,提问作者Abhishek S V
相关产品推荐
相关产品推荐

