翻转图像
难度:
标签:
题目描述
代码结果
运行时间: 19 ms, 内存: 16.1 MB
/*
* 题目思路:
* 1. 使用Stream API来实现对图像的操作。
* 2. 利用map方法对每一行进行水平翻转和反转操作。
*/
import java.util.Arrays;
public class Solution {
public int[][] flipAndInvertImage(int[][] image) {
return Arrays.stream(image)
.map(row -> {
// 水平翻转并反转图像
for (int i = 0; i < row.length / 2; i++) {
int temp = row[i];
row[i] = row[row.length - i - 1] == 0 ? 1 : 0;
row[row.length - i - 1] = temp == 0 ? 1 : 0;
}
// 如果行长是奇数,处理中间的元素
if (row.length % 2 != 0) {
row[row.length / 2] = row[row.length / 2] == 0 ? 1 : 0;
}
return row;
})
.toArray(int[][]::new);
}
}
解释
方法:
这道题目需要对每一行的二进制矩阵进行两个操作:首先进行水平翻转,即将每一行的元素顺序颠倒;然后进行反转操作,即将每个元素的0变成1,1变成0。题解中,首先通过切片的方式实现了每一行的水平翻转(image[i] = image[i][::-1]),然后通过一个内层循环遍历每行的每个元素,根据当前元素的值将其反转。
时间复杂度:
O(n^2)
空间复杂度:
O(1)
代码细节讲解
🦆
为什么在进行水平翻转后,直接使用原地修改的方式进行元素反转,而不是创建一个新的矩阵来存放结果?
▷🦆
在水平翻转的实现中,你选择了使用切片的方式(image[i] = image[i][::-1]),这种方法在所有编程语言中都适用吗?
▷🦆
在元素反转操作中,直接使用`1 - image[i][j]`来实现了二进制值的反转,这种方式是否有可能因为输入数据的错误而导致程序出错?例如输入元素不是0或1。
▷