资讯专栏INFORMATION COLUMN

leetcode5: 矩阵反转

hot_pot_Leo / 2555人阅读

摘要:题目实际就是先把子数组倒序,再把和互换。通过按位异或运算,可以实现两个值的交换,而不必使用临时变量。例如交换两个整数,的值,可通过下列语句实现异或运算符的特点是数两次异或同一个数仍然为原值

1.题目:
Given a binary matrix A, we want to flip the image horizontally, then invert it, and return the resulting image.

To flip an image horizontally means that each row of the image is reversed. For example, flipping [1, 1, 0] horizontally results in [0, 1, 1].

To invert an image means that each 0 is replaced by 1, and each 1 is replaced by 0. For example, inverting [0, 1, 1] results in [1, 0, 0].
实际就是先把子数组倒序,再把1和0互换。
例子1:

Input: [[1,1,0],[1,0,1],[0,0,0]]
Output: [[1,0,0],[0,1,0],[1,1,1]]
Explanation: First reverse each row: [[0,1,1],[1,0,1],[0,0,0]].
Then, invert the image: [[1,0,0],[0,1,0],[1,1,1]]

例子2:

Input: [[1,1,0,0],[1,0,0,1],[0,1,1,1],[1,0,1,0]]
Output: [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]
Explanation: First reverse each row: [[0,0,1,1],[1,0,0,1],[1,1,1,0],[0,1,0,1]].
Then invert the image: [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]

2.我的解法:
Javascript

var flipAndInvertImage = function(A) {
   return A.map(a =>  a.reverse().map(v => v? 0: 1 )
    )
};
Runtime: 68 ms, faster than 94.99% of JavaScript online submissions
for Flipping an Image. Memory Usage: 35.1 MB, less than 48.85% of
JavaScript online submissions for Flipping an Image.

其他解法:

Python

class Solution(object):
    def flipAndInvertImage(self, A):  
        return [[1-i for i in row[::-1]] for row in A]

1-i功能1和0的转化, row[::-1]做倒序, 再两次遍历。

扩展知识:

var flipAndInvertImage = function(A) {

return A.map(row => row.reverse().map(num => num^1));

};
这里用到了按位异或运算符^
参与运算的两个值,如果两个相应位相同,则结果为0,否则为1。即:0^0=0, 1^0=1, 0^1=1, 1^1=0

例如:10100001^00010001=10110000

0^0=0,0^1=1 0异或任何数=任何数

1^0=1,1^1=0 1异或任何数-任何数取反

任何数异或自己=把自己置0

(1)按位异或可以用来使某些特定的位翻转,如对数10100001的第2位和第3位翻转,可以将数与00000110进行按位异或运算。

          10100001^00000110=10100111 //1010 0001 ^ 0x06 = 1010 0001 ^ 6

(2)通过按位异或运算,可以实现两个值的交换,而不必使用临时变量。例如交换两个整数a,b的值,可通过下列语句实现:

    a=10100001,b=00000110

    a=a^b;   //a=10100111

    b=b^a;   //b=10100001

    a=a^b;   //a=00000110

(3)异或运算符的特点是:数a两次异或同一个数b(a=a^b^b)仍然为原值a.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/103134.html

相关文章

  • leetcode5: 矩阵反转

    摘要:题目实际就是先把子数组倒序,再把和互换。通过按位异或运算,可以实现两个值的交换,而不必使用临时变量。例如交换两个整数,的值,可通过下列语句实现异或运算符的特点是数两次异或同一个数仍然为原值 1.题目:Given a binary matrix A, we want to flip the image horizontally, then invert it, and return th...

    EasonTyler 评论0 收藏0
  • LeetCode5.最长回文子串 JavaScript

    摘要:最长回文子串给定一个字符串,找到中最长的回文子串。你可以假设的最大长度为。示例输入输出注意也是一个有效答案。 LeetCode5.最长回文子串 JavaScript 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1: 输入: babad 输出: bab 注意: aba 也是一个有效答案。 示例 2: 输入: cbbd输出: bb /*...

    philadelphia 评论0 收藏0
  • leetcode5 Longest Palindromic Substring 最长且为回数的子字符

    摘要:思路二指针最大长度现在我们从回数的特点入手。因此,假设当前得到的回数的最大长度为,我们可以判断或者是不是回数。假设此时指针指向,而已知最大回数子字符串的长度为。 题目要求 Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s i...

    Imfan 评论0 收藏0
  • LeetCode 第 267 场周赛

    摘要:第三组长度为,奇数,没有发生反转。箭头指示顺序即为单元格填充顺序。因此我们采用并查集处理朋友关系。如果没有冲突,再把修改后的副本赋值给原并查集,添加成功否则就认为这个添加无法进行,原并查集对象不做修改,该请求为。 ...

    Dionysus_go 评论0 收藏0
  • iOS开发UI篇--仿射变换(CGAffineTransform)使用小结

    摘要:一理论基础请参考简单分析二效果演示三实现代码位移变换缩放变换旋转变换组合变换仿射变换的组合使用矩阵的反转矩阵反转四补充单位矩阵变换,一般用于仿射变换的初始化或者还原。点击加入如果觉得对你还有些用,就关注小编喜欢这一篇文章。 一、理论基础 请参考 CGAffineTransform简单分析 二、效果演示 showImg(https://segmentfault.com/img/remot...

    Meils 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<