前言
经过前期的基础训练以及部分实战练习,粗略掌握了各种题型的解题思路。后续开始专项练习。
描述
给定一个
n x n
的二进制矩阵image
,先 水平 翻转图像,然后 反转 图像并返回 结果 。水平翻转图片就是将图片的每一行都进行翻转,即逆序。
- 例如,水平翻转
[1,1,0]
的结果是[0,1,1]
。反转图片的意思是图片中的
0
全部被1
替换,1
全部被0
替换。
- 例如,反转
[0,1,1]
的结果是[1,0,0]
。示例 1:
输入:image = [[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:
输入:image = [[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]]提示:
n == image.length
n == image[i].length
1 <= n <= 20
images[i][j]
==0
或1
.
实现原理与步骤
1.图像翻转采用双指针
2.图像反转采用双循环
3.数字翻转当前数与1异或
4.优化方案需模拟寻找规律减少遍历次数。
代码实现
class Solution {
public int[][] flipAndInvertImage(int[][] image) {
int row=image.length;
int col=image[0].length;
for(int i=0;i<row;i++){
int left=0;
int right=col-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<row;i++){
for(int j=0;j<col;j++){
image[i][j]=image[i][j]^1;
}
}
return image;
}
}