如何将矩形矩阵反对角线上的负元素前移?该操作是否可行?
结论:这个操作完全可以实现
首先我们把原矩阵和目标矩阵的结构拆解开,看得更直观:
原矩阵(3行4列)
行0: [1, 2, -3, 4] 行1: [5, -6, 7, 8] 行2: [9, 1, 2, 3]
目标矩阵
行0: [1, 2, 9, 4] 行1: [5, -3, 7, 8] 行2: [-6, 1, 2, 3]
关键分析:定位目标反对角线
观察元素变化:-3从位置(0,2)移到(1,1),-6从(1,1)移到(2,0),9从(2,0)移到(0,2)。这三个位置满足行索引 + 列索引 = 2,属于同一条从右上延伸到左下的反对角线。
题目里说的“反对角线上的负元素沿反对角线前移”,结合目标矩阵的结果来看,实际是把这条对角线上的非负元素移到对角线的最右上位置,负元素依次沿着对角线向左下方向排列。
实现思路(以C语言为例)
我们可以通过以下几步完成这个操作:
- 提取目标反对角线上的所有元素,存入临时数组;
- 把临时数组里的负元素和非负元素分开;
- 按照「非负元素在前,负元素保留原顺序跟在后面」的规则重组临时数组;
- 将重组后的元素依次放回原矩阵的对应反对角线位置。
示例代码
#include <stdio.h> int main() { int arr[3][4] = {1,2,-3,4, 5,-6,7,8, 9,1,2,3}; int temp[3]; int negatives[2], non_negatives[1]; int neg_idx = 0, non_neg_idx = 0; // 提取反对角线元素(满足i+j=2) temp[0] = arr[0][2]; temp[1] = arr[1][1]; temp[2] = arr[2][0]; // 分离负元素和非负元素 for (int i = 0; i < 3; i++) { if (temp[i] < 0) { negatives[neg_idx++] = temp[i]; } else { non_negatives[non_neg_idx++] = temp[i]; } } // 重组临时数组:非负元素在前,负元素按原顺序跟进 temp[0] = non_negatives[0]; temp[1] = negatives[0]; temp[2] = negatives[1]; // 将重组后的元素放回原矩阵 arr[0][2] = temp[0]; arr[1][1] = temp[1]; arr[2][0] = temp[2]; // 打印验证结果 for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { printf("%d ", arr[i][j]); } printf("\n"); } return 0; }
运行这段代码后,输出的矩阵就和题目中的目标矩阵完全一致。
内容的提问来源于stack exchange,提问作者Yutat
相关产品推荐
相关产品推荐

