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+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

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

  • 相关阅读:
    Exp9 Web安全基础
    Exp 8 Web基础 ——20175201张驰
    Exp7 网络欺诈防范 20175201张驰
    《知识付费平台》个人报告——20175201张驰
    20175201 EXP6 MSF基础应用
    Exp5 信息搜集与漏洞扫描——20175201张驰
    Exp4 恶意代码分析—20175201张驰
    20175201张驰exp3——免杀原理与实践
    #20175201张驰 网络对抗exp2——后门原理与实践
    20175201张驰 网络对抗exp1—PC平台逆向破解
  • 原文地址:https://www.cnblogs.com/xiaochuan94/p/10808058.html
Copyright © 2011-2022 走看看