题目重点:转置不等于旋转,非方阵输出shape也不同。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 矩形二维list,transpose与clockwise返回新矩阵;空输入返回空,零列list可能丢显式维度元数据。
- sparse使用(rows,cols,{(r,c):value}),省略值视0,不改变数值。3D变体需明确轴操作,不存在唯一“转置”。
解题路线
- 转置映射(r,c)→(c,r),新shape(cols,rows)。顺时针旋转映射(r,c)→(c,rows−1−r),不能直接swap坐标就称旋转。
- sparse只遍历非零坐标应用映射,保留新shape;不构造rows×cols密集矩阵。重复坐标合并/零项删去应在输入规范化处理。
- 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各有何布局成本?
