You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编程新手求助:二维二进制矩阵翻转反转后返回结果不符问题排查

问题分析与解决

问题根源

  • 你的代码只完成了反转每个二进制元素的操作,完全漏掉了水平翻转图像的核心步骤。
  • 控制台输出看起来“正确”是因为你遍历列的顺序是从后往前,打印的是反转后的元素,但数组本身的元素顺序并没有被翻转——比如原行是[1,0],你的代码处理后数组变成[0,1],但打印时先输出1(原索引1的元素反转后)再输出0(原索引0的元素反转后),看起来像是先翻转再反转的结果,但数组实际存储的是[0,1],和预期的[1,0]完全相反。

正确实现思路

要完成需求,需要两步:

  1. 水平翻转:将每一行的元素左右对称交换(比如[a,b,c]变成[c,b,a])
  2. 反转图像:将每个元素取反(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 21:06:24