题目重点:按顺序执行行列交换、行列反转和顺时针旋转,核对当前维度与输入保留。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练操作元组名明确为swap_rows/cols、reverse_row/col、rotate_cw;行列反转指反转指定行/列内部元素,不是颠倒全部行顺序。
- 矩阵可以长方形;顺时针旋转后H×W变W×H,后续下标按新维度验证。输入复制,不修改原数组。
解题路线
- 行交换直接交换两行引用;列交换逐行交换两个位置。指定行反转用reverse,指定列反转交换上下对称元素。
- 旋转坐标映射为old(r,c)→new(c,H−1−r),先分配W行H列,再按映射填值。不能只写方阵原地四角交换用于矩形输入。
- 操作逐个应用,切勿把所有下标按初始尺寸解释。合法性检查在对应操作前做;如返回错误,原始输入仍不受影响,因为只处理副本。
手动走一遍
[[1,2,3],[4,5,6]]旋转为[[4,1],[5,2],[6,3]];此时行index2有效,列index2越界。对新矩阵reverse_row(1)得到[[4,1],[2,5],[6,3]]。
Python 参考实现
下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。
代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。
def transform_matrix(matrix, operations):
"""Training operation tuples: swap_rows/i/j, swap_cols/i/j, reverse_row/i,
reverse_col/j, rotate_cw. Coordinate bounds refer to CURRENT dimensions.
Input is not mutated; supports rectangular matrices.
"""
if not matrix or not matrix[0] or any(len(r)!=len(matrix[0]) for r in matrix):
raise ValueError("nonempty rectangular input required")
a=[list(row) for row in matrix]
for op in operations:
if not op:raise ValueError("empty operation")
kind,*args=op;h,w=len(a),len(a[0])
if kind in ('swap_rows','swap_cols'):
if len(args)!=2:raise ValueError("two indices required")
i,j=args;bound=h if kind=='swap_rows' else w
if not (0<=i<bound and 0<=j<bound):raise IndexError("index out of range")
if kind=='swap_rows':a[i],a[j]=a[j],a[i]
else:
for row in a:row[i],row[j]=row[j],row[i]
elif kind in ('reverse_row','reverse_col'):
if len(args)!=1:raise ValueError("one index required")
i=args[0];bound=h if kind=='reverse_row' else w
if not 0<=i<bound:raise IndexError("index out of range")
if kind=='reverse_row':a[i].reverse()
else:
for r in range(h//2):a[r][i],a[h-r-1][i]=a[h-r-1][i],a[r][i]
elif kind=='rotate_cw' and not args:
a=[[a[h-1-r][c] for r in range(h)] for c in range(w)]
else:raise ValueError("unknown operation or wrong arity")
return a
复杂度
复制O(HW);行交换O(1),列交换O(H),反转行O(W)/列O(H),旋转O(HW)时间/空间。总代价逐操作求和,不能统称每操作O(1)。
易错点与追问
容易失分的边界
- 矩形旋转不更新尺寸会在下一步用错下标。
- reverse_col不是把所有列的顺序反转,语义需先固定。
继续深挖
- 若只做全矩阵旋转/镜像可维护坐标映射直到最终物化;夹杂任意单行反转时简单全局映射不够。
- 若要求原地且方阵,可transpose+reverse每行;矩形原地变换需要重排一维存储及重设shape。
