leetcode--832 翻转图像

题目描述:
在这里插入图片描述
示例1.

输入: [[1,1,0],[1,0,1],[0,0,0]]
输出: [[1,0,0],[0,1,0],[1,1,1]]
解释: 首先翻转每一行: [[0,1,1],[1,0,1],[0,0,0]];
然后反转图片: [[1,0,0],[0,1,0],[1,1,1]]

示例2.

输入: [[1,1,0,0],[1,0,0,1],[0,1,1,1],[1,0,1,0]]
输出: [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]
解释: 首先翻转每一行: [[0,0,1,1],[1,0,0,1],[1,1,1,0],[0,1,0,1]];
然后反转图片: [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]

说明:

1 <= A.length = A[0].length <= 20
0 <= A[i][j] <= 1

思路:

不管内层数组长度是奇数还是偶数,交换的元素角标都有一个关系:即A[i][j]对应的是A[i][c-j-1],c是列数。这样内层的for循环只需要循环到一半,即j<A[0].length/2,进行变值d的同时进行交换就行。
但是,当内层数组长度为奇数时,j<A[0].length/2时会取不到中间的元素,那么就进行单独的判断:当内层数组的长度为奇数时,直接将每一行的A[0].length/2变值。最后返回二维数组A即可。

补充:
怎么样将1变为0,0变为1?
可以采用异或的方式,相同的值为0,不相同的值为1
在这里:1^1=0 0^1=1

java

class Solution {
    public int[][] flipAndInvertImage(int[][] A) {
        int m=A[0].length;
        for(int i=0;i<A.length;i++){
            if(m%2==1){
            A[i][m/2]=A[i][m/2]^1;
              }
            for(int j=0;j<m/2;j++){
                A[i][j]=A[i][j]^1;
                A[i][m-j-1]=A[i][m-j-1]^1;
                int temp=A[i][j];
                A[i][j]=A[i][m-j-1];
                A[i][m-j-1]=temp;
            }
        }
        return A;
    }
}

在这里插入图片描述

发布了73 篇原创文章 · 获赞 7 · 访问量 3579

猜你喜欢

转载自blog.csdn.net/weixin_43801718/article/details/103405735