Python数组Zigzag检测代码实现:求优化建议
优化建议及改进代码
你的代码能正常运行已经很棒了,针对Python代码规范和效率,给你几个具体的优化方向:
1. 避免频繁使用np.append
numpy数组是固定内存大小的结构,每次调用np.append都会重新分配内存并复制整个数组,当数组长度接近10000时,效率会非常低。建议先用Python列表处理动态追加,最后再转numpy数组(如果需要的话),或者直接用列表完成任务(纯Python列表在这类场景下更灵活)。
2. 修正数组长度的判断逻辑
题目要求数组长度<10000,且至少3个元素才能形成连续三元组,你之前的3 < n < 10000会漏掉n=3的合法情况,应该改成3 <= n < 10000。
3. 简化输入处理
逐个输入元素体验较差,建议让用户一次性输入所有元素(用空格分隔),批量转换为整数,同时统一做值范围校验。
4. 简化Zigzag判断逻辑
原来的两个条件可以合并成一个更简洁的表达式:利用布尔值的异或关系,(当前元素 < 中间元素) != (中间元素 < 后一个元素),这个表达式等价于a<b>c或a>b<c,代码更紧凑。
5. 用for循环替代while循环
Python中遍历固定范围的索引时,for i in range(len(arr)-2)比手动维护while循环的计数器更符合语言风格,代码可读性更高。
6. 移除不必要的依赖
如果不需要numpy的后续计算,纯Python列表完全可以完成这个任务,不需要引入numpy和sys,减少代码的复杂度。
纯Python优化版本
# 获取输入并处理 n = int(input("Enter the length of the array:")) if not (3 <= n < 10000): print("Length is out of bound") else: # 批量获取数组元素 elements = input("Enter inputs separated by spaces:").split() # 校验元素数量和值范围 if len(elements) != n: print("输入的元素数量与长度不匹配") else: try: arr = [int(x) for x in elements] except ValueError: print("输入必须是整数") else: # 检查每个元素是否小于1000 if any(x >= 1000 for x in arr): print("Value is not less than 1000") else: result = [] for i in range(len(arr)-2): # 简化Zigzag判断 if (arr[i] < arr[i+1]) != (arr[i+1] < arr[i+2]): result.append(1) else: result.append(0) print(result)
保留numpy的优化版本
如果必须用numpy,优化动态追加的问题:
import numpy as np n = int(input("Enter the length of the array:")) if not (3 <= n < 10000): print("Length is out of bound") else: elements = input("Enter inputs separated by spaces:").split() if len(elements) != n: print("输入的元素数量与长度不匹配") else: try: arr = np.array([int(x) for x in elements], dtype=np.int32) except ValueError: print("输入必须是整数") else: if (arr >= 1000).any(): print("Value is not less than 1000") else: # 预分配结果数组,避免动态追加 result = np.zeros(len(arr)-2, dtype=np.int32) for i in range(len(arr)-2): if (arr[i] < arr[i+1]) != (arr[i+1] < arr[i+2]): result[i] = 1 print(result)
内容的提问来源于stack exchange,提问作者ShanOH
相关产品推荐
相关产品推荐

