Skip to content

Commit b0f34a7

Browse files
committed
Add 0832 Solution.js and README.md
1 parent f49f0a4 commit b0f34a7

File tree

2 files changed

+117
-0
lines changed

2 files changed

+117
-0
lines changed
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
# 翻转图像
2+
3+
### 题目描述
4+
5+
给定一个二进制矩阵 `A`,我们想先水平翻转图像,然后反转图像并返回结果。
6+
7+
水平翻转图片就是将图片的每一行都进行翻转,即逆序。例如,水平翻转 `[1, 1, 0]` 的结果是 `[0, 1, 1]`
8+
9+
反转图片的意思是图片中的 `0` 全部被 `1` 替换, `1` 全部被 `0` 替换。例如,反转 `[0, 1, 1]` 的结果是 `[1, 0, 0]`
10+
11+
**示例 1**
12+
13+
```
14+
输入: [[1,1,0],[1,0,1],[0,0,0]]
15+
输出: [[1,0,0],[0,1,0],[1,1,1]]
16+
解释: 首先翻转每一行: [[0,1,1],[1,0,1],[0,0,0]];
17+
然后反转图片: [[1,0,0],[0,1,0],[1,1,1]]
18+
```
19+
20+
**示例 2**
21+
22+
```
23+
输入: [[1,1,0,0],[1,0,0,1],[0,1,1,1],[1,0,1,0]]
24+
输出: [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]
25+
解释: 首先翻转每一行: [[0,0,1,1],[1,0,0,1],[1,1,1,0],[0,1,0,1]];
26+
然后反转图片: [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]
27+
```
28+
29+
**说明**
30+
31+
- `1 <= A.length = A[0].length <= 20`
32+
- `0 <= A[i][j] <= 1`
33+
34+
### 解法
35+
36+
**第一种解法**
37+
38+
**思路**
39+
40+
实际上,对数组进行翻转并取反,数组只需要对比对称位上的数组是否相同,如果相同,就进行取反,如果不同,则不去取反,以为当对称位数字不同,进行一次翻转后在取反和原先的数字是相同的。
41+
42+
**算法**
43+
44+
```javascript
45+
var flipAndInvertImage = function(A) {
46+
const len = A.length;
47+
for (let k = 0; k < len; k++ ) {
48+
let j = len - 1;
49+
for(let i = 0; i <= ~~( j / 2 ); i++){
50+
if ( A[k][i] === A[k][j - i] ) {
51+
A[k][i] === 1 ? A[k][i] = A[k][j - i] = 0 : A[k][i] = A[k][j - i] = 1;
52+
}
53+
}
54+
}
55+
return A;
56+
}
57+
```
58+
59+
**复杂度分析**
60+
61+
暂无
62+
63+
**第二种解法**
64+
65+
**思路**
66+
67+
正常的进行交换取反值。这个解法中双非~~和 按位异或 ^ 的用法非常棒。
68+
69+
**算法**
70+
71+
```javascript
72+
var flipAndInvertImage2 = function(A) {
73+
for (let i = 0; i < A.length; ++i) {
74+
let last = A[i].length - 1;
75+
for (let j = 0; j <= ~~(last / 2); ++j) {
76+
[ A[i][j], A[i][last - j] ] = [ A[i][last - j] ^ 1, A[i][j] ^ 1 ];
77+
}
78+
}
79+
return A;
80+
};
81+
```
82+
83+
**复杂度分析**
84+
85+
暂无
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/**
2+
* @param {number[][]} A
3+
* @return {number[][]}
4+
*/
5+
6+
/**
7+
* Author: Mcnwork2018
8+
*/
9+
10+
// 第一种思路,碰到相等的情况才进行取反
11+
var flipAndInvertImage = function(A) {
12+
const len = A.length;
13+
for (let k = 0; k < len; k++ ) {
14+
let j = len - 1;
15+
for(let i = 0; i <= ~~( j / 2 ); i++){
16+
if ( A[k][i] === A[k][j - i] ) {
17+
A[k][i] === 1 ? A[k][i] = A[k][j - i] = 0 : A[k][i] = A[k][j - i] = 1;
18+
}
19+
}
20+
}
21+
return A;
22+
}
23+
// 第二种思路,无论是否相等,对每个值都进行交换并取反
24+
var flipAndInvertImage2 = function(A) {
25+
for (let i = 0; i < A.length; ++i) {
26+
let last = A[i].length - 1;
27+
for (let j = 0; j <= ~~(last / 2); ++j) {
28+
[ A[i][j], A[i][last - j] ] = [ A[i][last - j] ^ 1, A[i][j] ^ 1 ];
29+
}
30+
}
31+
return A;
32+
};

0 commit comments

Comments
 (0)