编程新手求助:二维二进制矩阵翻转反转后返回结果不符问题排查
问题分析与解决
问题根源
- 你的代码只完成了反转每个二进制元素的操作,完全漏掉了水平翻转图像的核心步骤。
- 控制台输出看起来“正确”是因为你遍历列的顺序是从后往前,打印的是反转后的元素,但数组本身的元素顺序并没有被翻转——比如原行是
[1,0],你的代码处理后数组变成[0,1],但打印时先输出1(原索引1的元素反转后)再输出0(原索引0的元素反转后),看起来像是先翻转再反转的结果,但数组实际存储的是[0,1],和预期的[1,0]完全相反。
正确实现思路
要完成需求,需要两步:
- 水平翻转:将每一行的元素左右对称交换(比如
[a,b,c]变成[c,b,a]) - 反转图像:将每个元素取反(0变1,1变0)
可以分开实现,也可以合并成一步(在翻转的同时完成反转,效率更高)
修正后的代码示例
方法一:分步实现(清晰直观)
class Solution { public int[][] flipAndInvertImage(int[][] image) { int n = image.length; // 第一步:水平翻转每一行 for (int i = 0; i < n; i++) { int left = 0, right = n - 1; // 双指针交换左右元素 while (left < right) { int temp = image[i][left]; image[i][left] = image[i][right]; image[i][right] = temp; left++; right--; } } // 第二步:反转每个元素 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { // 用异或1实现0和1的反转 image[i][j] ^= 1; } } return image; } }
方法二:合并操作(更高效)
class Solution { public int[][] flipAndInvertImage(int[][] image) { int n = image.length; for (int i = 0; i < n; i++) { int left = 0, right = n - 1; // 同时完成翻转和反转 while (left <= right) { // 交换左右元素并反转 int temp = image[i][left] ^ 1; image[i][left] = image[i][right] ^ 1; image[i][right] = temp; left++; right--; } } return image; } }
关键说明
- 水平翻转的核心是交换元素位置,而不是单纯改变遍历顺序;
- 控制台的打印顺序不等于数组的实际存储顺序,调试时要注意直接查看数组的元素索引值,而不是只看打印结果。
内容的提问来源于stack exchange,提问作者Mustafa Ahmed
相关产品推荐
相关产品推荐

