zoukankan      html  css  js  c++  java
  • LeetCode算法题-Flipping an Image(Java实现)

    这是悦乐书的第324次更新,第347篇原创

    01 看题和准备

    今天介绍的是LeetCode算法题中Easy级别的第194题(顺位题号是832)。给定二进制矩阵A,我们想要水平翻转图像,然后反转它,并返回结果图像。


    水平翻转图像意味着图像的每一行都是相反的。 例如,水平翻转[1,1,0]会产生[0,1,1]。

    反转图像意味着每个0替换为1,每个1替换为0。例如,反转[0,1,1]会产生[1,0,0]。


    例如:

    输入:[[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]]。


    输入:[[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

    本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

    02 第一种解法

    从题目的描述和示例来看,我们需要对二维数组进行两次操作,一是反转,二是换值。

    反转操作,首先需要拿到二维数组A中每一行数据,也就是一个一维数组,然后对该数组进行元素互换,利用双指针思路。换值操作,将0换成1,1换成0即可。

    public int[][] flipAndInvertImage(int[][] A) {
        int row = A.length;
        for (int i=0; i<row; i++) {
            reverse(A[i]);
            invert(A[i]);
        }
        return A;
    }
    
    public void reverse(int[] rows){
        int start = 0, end = rows.length-1;
        while (start < end) {
            int temp = rows[start];
            rows[start] = rows[end];
            rows[end] = temp;
            start++;
            end--;
        }
    }
    
    public void invert(int[] rows){
        int n = rows.length;
        for (int i=0; i<n; i++) {
            if (rows[i] == 0) {
                rows[i] = 1;
            } else {
                rows[i] = 0;
            }
        }
    }
    

    03 第二种解法

    我们还可以简化下,将反转和换值放在一个循环中处理。反转依旧是使用双指针进行替换,换值则利用位运算异或,异或运算的规则是对应位不同就取1,1对1进行异或运算的结果是0,1对0进行异或运算的结果是1。直接将数组元素与1进行异或运算,就能达到换值的效果。

    public int[][] flipAndInvertImage2(int[][] A) {
        for (int[] rows : A) {
            int start = 0, end = rows.length-1;
            while (start <= end) {
                int temp = rows[start]^1;
                rows[start] = rows[end]^1;
                rows[end] = temp;
                start++;
                end--;
            }
        }
        return A;
    }
    

    04 小结

    算法专题目前已日更超过五个月,算法题文章194+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

    以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

  • 相关阅读:
    使用 Log4Net 记录日志
    NuGet安装和使用
    .NET Framework 4 与 .NET Framework 4 Client Profile
    “init terminating in do_boot” Windows10 Rabbit MQ fails to start
    Ubuntu / Win7 安装db2 v10.5
    Win7下的内置FTP组件的设置详解
    c/s模式 (C#)下Ftp的多文件上传及其上传进度
    C#路径/文件/目录/I/O常见操作汇总
    C# 遍历指定目录下的所有文件及文件夹
    Mongodb主从复制 及 副本集+分片集群梳理
  • 原文地址:https://www.cnblogs.com/xiaochuan94/p/10808058.html
Copyright © 2011-2022 走看看