力扣第 832 题。给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果。
水平翻转图片就是将图片的每一行都进行翻转,即逆序。例如,水平翻转 [1, 1, 0] 的结果是 [0, 1, 1]。
反转图片的意思是图片中的 0 全部被 1 替换, 1 全部被 0 替换。例如,反转 [0, 1, 1] 的结果是 [1, 0, 0]。
示例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
该题目中,虽然是一个二维数组,但是如果我们考虑问题,可以只考虑一维数组的信息。只要将一维数组的场景考虑好了,那么剩下的数据再处理也不复杂了。
我们以示例 1 为例子
第一步,获取第一行数据 1,1,0
将第一个位置的元素和最后一个位置的元素替换位置,因为是 3 个元素,所以第二个位置的元素不需要改变,得到如下结果:
在上面的替换操作过程中,我们需要掌握以下技巧:
class Solution {
public int[][] flipAndInvertImage(int[][] A) {
//每行数组的最右侧数据下标
int rightIndex = A[0].length - 1;
//每行数组下标的中间位置,每次循环的时候,只需要循环到中间位置,进行替换即可
int dividColCount = A[0].length / 2;
//判断每行记录的个数是基数还是偶数
int perCol = A[0].length % 2;
for (int i = 0; i < A.length; i++) {
for (int j = 0; j < dividColCount; j++) {
//取出一半长度左边位置的数据
int leftValue = A[i][j];
//取出右侧对应的位置数据
int rightValue = A[i][rightIndex - j];
//左边数据用右侧数据赋值,并且进行反转
A[i][j] = rightValue == 0 ? 1 : 0;
//右边数据用左侧的数据赋值,并且进行反转
A[i][rightIndex - j] = leftValue == 0 ? 1 : 0;
}
//如果每行的数组长度是基数个数,则需要将中间位置的数据进行反转图片操作
if (perCol != 0) {
A[i][dividColCount] = A[i][dividColCount] == 0 ? 1 : 0;
}
}
return A;
}
}
func flipAndInvertImage(A [][]int) [][]int {
//每行数组的最右侧数据下标
rightIndex := len(A[0]) - 1
//每行数组下标的中间位置,每次循环的时候,只需要循环到中间位置,进行替换即可
dividColCount := len(A[0]) / 2
//判断每行记录的个数是基数还是偶数
perCol := len(A[0]) % 2
for i := 0; i < len(A); i++ {
for j := 0; j < dividColCount; j++ {
//取出一半长度左边位置的数据
leftValue := A[i][j]
//取出右侧对应的位置数据
rightValue := A[i][rightIndex - j]
//左边数据用右侧数据赋值,并且进行反转
A[i][j] = changeNum(rightValue)
//右边数据用左侧的数据赋值,并且进行反转
A[i][rightIndex - j] = changeNum(leftValue)
}
//如果每行的数组长度是基数个数,则需要将中间位置的数据进行反转图片操作
if perCol != 0 {
A[i][dividColCount] = changeNum(A[i][dividColCount])
}
}
return A;
}
//将数据进行反转
func changeNum(a int) int{
if a == 0 {
return 1
}else {
return 0
}
}