Python代码调试请求:将数组转换为Zig-Zag排列格式
Zig-Zag数组重排代码修复
原代码问题诊断
- 索引增量错误:
j += j导致j始终为0,无法遍历数组元素,只会重复插入前两个元素。 - 数组越界:
r = (n//2)+1的计算方式错误,导致j+r超出数组索引范围,触发IndexError。 - 结果长度异常:循环执行r次,每次插入两个元素,最终结果长度大于原数组(奇数n时)。
修复方案1:排序后交换相邻元素(高效简洁)
先对数组排序,再从索引1开始,每隔一个位置交换相邻元素,确保奇数索引的元素大于左右两侧,直接在原数组上修改,时间复杂度O(n log n)(主要来自排序)。
def zigZag(self, arr, n): arr.sort() # 从索引1开始,步长2交换相邻元素 for i in range(1, n-1, 2): arr[i], arr[i+1] = arr[i+1], arr[i] return arr
验证示例:
- 输入
[1,2,3,4,5]→ 排序后[1,2,3,4,5]→ 交换后[1,3,2,5,4],满足1<3>2<5>4。 - 输入
[5,3,1,2,4]→ 排序后[1,2,3,4,5]→ 交换后[1,3,2,5,4],符合Zig-Zag要求。
修复方案2:拆分合并思路修正
保留原代码的拆分合并逻辑,调整拆分方式和索引处理,构建新数组返回:
def zigZag(self, arr, n): arr.sort() res = [] mid = n // 2 # 右半部分起始索引:奇数长度时跳过中间元素 right_start = mid + 1 if n % 2 else mid j = 0 # 交替合并左右两部分 while j < mid: res.append(arr[j]) res.append(arr[right_start + j]) j += 1 # 奇数长度数组添加中间元素 if n % 2: res.append(arr[mid]) return res
验证示例:
- 输入
[1,2,3,4,5]→ 拆分左半[1,2]、右半[4,5]→ 合并后添加中间元素3 → 结果[1,4,2,5,3],满足1<4>2<5>3。
内容的提问来源于stack exchange,提问作者Arnab21
相关产品推荐
相关产品推荐

