# 832. 翻转图像
# 题目
给定一个二进制矩阵 A
,我们想先水平翻转图像,然后反转图像并返回结果。
水平翻转图片就是将图片的每一行都进行翻转,即逆序。例如,水平翻转 [1, 1, 0] 的结果是 [0, 1, 1]。
反转图片的意思是图片中的 0 全部被 1 替换, 1 全部被 0 替换。例如,反转 [0, 1, 1] 的结果是 [1, 0, 0]。
# 题解
# 双指针 + 模拟
普通思路:
/**
* @param {number[][]} A
* @return {number[][]}
*/
var flipAndInvertImage = function(A) {
let rows = A.length,
cols = A[0].length;
// 翻转行
for (let r = 0; r < rows; ++r) {
let i = 0,
j = cols - 1;
while (i < j) {
let t = A[r][i];
A[r][i] = A[r][j];
A[r][j] = t;
i++;
j--;
}
}
// 反转图片
for (let r = 0; r < rows; ++r) {
for (let c = 0; c < cols; ++c) {
A[r][c] = +!A[r][c];
}
}
return A;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
行翻转的时候可以同时处理反转图片,考虑下面情况:
A[r][i]=0 A[r][j]=0
经过行翻转然后反转图片后为A[r][i]=1 A[r][j]=1
A[r][i]=1 A[r][j]=1
经过行翻转然后反转图片后为A[r][i]=0 A[r][j]=0
A[r][i]=1 A[r][j]=0
经过行翻转然后反转图片后为A[r][i]=1 A[r][j]=0
A[r][i]=0 A[r][j]=1
经过行翻转然后反转图片后为A[r][i]=0 A[r][j]=1
可以发现如果两个指针指向的相同那么最后结果就是取反,如果指向的值不同最后结果就是不改变
/**
* @param {number[][]} A
* @return {number[][]}
*/
var flipAndInvertImage = function(A) {
let rows = A.length,
cols = A[0].length;
for (let r = 0; r < rows; ++r) {
let i = 0,
j = cols - 1;
while (i < j) {
if (A[r][i] === A[r][j]) {
A[r][i] ^= 1;
A[r][j] ^= 1;
}
i++;
j--;
}
// 中间的值直接取反
if (i === j) A[r][i] ^= 1;
}
return A;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24