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

Python代码调试请求:将数组转换为Zig-Zag排列格式

Zig-Zag数组重排代码修复

原代码问题诊断

  1. 索引增量错误:j += j 导致j始终为0,无法遍历数组元素,只会重复插入前两个元素。
  2. 数组越界:r = (n//2)+1 的计算方式错误,导致j+r超出数组索引范围,触发IndexError。
  3. 结果长度异常:循环执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 02:50:40