如何用Python对二维数组进行Zigzag遍历并按行拼接值
解决二维数组的之字形(Zigzag)遍历问题
嘿,我来帮你搞定这个之字形遍历的难题!先明确下咱们要实现的遍历规则(对应你提到的那张图):从数组左上角出发,沿着对角线方向交替切换遍历方向——比如先从左到右走第一行,接着斜向左下遍历下一条对角线,再向下移动一格后斜向右上遍历,以此类推,直到把所有元素都遍历完,最后把这些数值拼接成一行。
实现思路
核心是按对角线分组:二维数组中,每个元素的行索引i和列索引j的和k = i + j相同的元素,都在同一条对角线上。我们只需要遍历所有可能的k值,然后根据k的奇偶性来决定当前对角线的遍历方向:
- 当
k为偶数时:从对角线的最下方元素往最上方遍历 - 当
k为奇数时:从对角线的最上方元素往最下方遍历
代码示例(Python)
假设你的result是一个二维列表(如果是NumPy数组,只需要把索引方式从result[i][j]改成result[i,j]即可):
# 模拟你的输入数组(示例) result = [ [0, 0, 0, 0, 1, 0], [0, 1, 1, 1, 1, 1], [0, 0, 1, 0, 1, 1], [0, 0, 0, 0, 0, 1], [1, 1, 1, 1, 1, 0], [1, 1, 1, 1, 1, 1] ] rows = len(result) cols = len(result[0]) if rows > 0 else 0 zigzag_elements = [] # 遍历所有对角线(k从0到rows+cols-2) for k in range(rows + cols - 1): if k % 2 == 0: # 偶数对角线:从下往上走 # 起始行索引:取k和最后一行索引的较小值 start_i = min(k, rows - 1) # 结束行索引:取0和(k - 列数 +1)的较大值,避免列索引越界 end_i = max(0, k - cols + 1) # 倒序遍历行索引,计算对应的列索引j = k - i for i in range(start_i, end_i - 1, -1): j = k - i zigzag_elements.append(str(result[i][j])) else: # 奇数对角线:从上往下走 start_i = max(0, k - cols + 1) end_i = min(k, rows - 1) for i in range(start_i, end_i + 1): j = k - i zigzag_elements.append(str(result[i][j])) # 把遍历到的元素拼接成一行(这里用空格分隔,你可以换成空字符串直接拼接) final_output = ' '.join(zigzag_elements) print(final_output)
代码说明
- 先获取数组的行数和列数,处理空数组的边界情况
- 遍历每个对角线的
k值,覆盖所有可能的对角线 - 根据
k的奇偶性切换遍历方向,确保每一条对角线的元素都被正确收集 - 最后把收集到的元素转换成字符串并拼接成一行
这样就能完美实现你需要的之字形遍历啦!
内容的提问来源于stack exchange,提问作者Dian Arief R
相关产品推荐
相关产品推荐

