SWE · Coding

矩阵转置与90°旋转:维度、稀疏坐标和3D轴

转置不等于旋转,非方阵输出shape也不同。

题目重点:转置不等于旋转,非方阵输出shape也不同。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 矩形二维list,transpose与clockwise返回新矩阵;空输入返回空,零列list可能丢显式维度元数据。
  • sparse使用(rows,cols,{(r,c):value}),省略值视0,不改变数值。3D变体需明确轴操作,不存在唯一“转置”。

解题路线

  1. 转置映射(r,c)→(c,r),新shape(cols,rows)。顺时针旋转映射(r,c)→(c,rows−1−r),不能直接swap坐标就称旋转。
  2. sparse只遍历非零坐标应用映射,保留新shape;不构造rows×cols密集矩阵。重复坐标合并/零项删去应在输入规范化处理。
  3. 3D轴置换如[a,b,c]→[c,a,b]可视tensor transpose;旋转还需指定平面及一个轴的反序。特征值问题是单独数学目标,不能用这些几何重排公式代替。

手动走一遍

[[1,2,3],[4,5,6]]转置[[1,4],[2,5],[3,6]],顺时针[[4,1],[5,2],[6,3]]。稀疏2×3的(1,2)=7旋转后3×2的(2,0)=7,值不变但坐标变。

Python 参考实现

下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。

代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。

def shape(matrix):
    rows=len(matrix);cols=len(matrix[0]) if rows else 0
    if any(len(row)!=cols for row in matrix):raise ValueError("ragged matrix")
    return rows,cols


def transpose(matrix):
    rows,cols=shape(matrix)
    return [[matrix[r][c] for r in range(rows)] for c in range(cols)]


def clockwise(matrix):
    rows,cols=shape(matrix)
    return [[matrix[rows-1-c][r] for c in range(rows)] for r in range(cols)]


def sparse_clockwise(rows,cols,entries):
    if rows<0 or cols<0 or any(not 0<=r<rows or not 0<=c<cols for r,c in entries):raise ValueError("invalid sparse dimensions/index")
    return cols,rows,{(c,rows-1-r):value for (r,c),value in entries.items()}

复杂度

dense O(RC)时间/输出空间;sparse O(nnz)期望时间/O(nnz)输出空间。方阵可按四格循环原地旋转,非方阵原地索引置换更复杂。

易错点与追问

容易失分的边界

  • 只反转行序不执行转置不会得到完整90度旋转。
  • 稀疏矩阵形状不能从最大非零坐标猜,最后若干行列可能全零。

继续深挖

  • 方阵原地四角循环如何验证四次旋转回原值?
  • 3D tensor permute与contiguous copy各有何布局成本?
✓已复制微信号!