题目描述:
示例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
思路:
不管内层数组长度是奇数还是偶数,交换的元素角标都有一个关系:即A[i][j]对应的是A[i][c-j-1],c是列数。这样内层的for循环只需要循环到一半,即j<A[0].length/2,进行变值d的同时进行交换就行。
但是,当内层数组长度为奇数时,j<A[0].length/2时会取不到中间的元素,那么就进行单独的判断:当内层数组的长度为奇数时,直接将每一行的A[0].length/2变值。最后返回二维数组A即可。
补充:
怎么样将1变为0,0变为1?
可以采用异或的方式,相同的值为0,不相同的值为1
在这里:1^1=0 0^1=1
java
class Solution {
public int[][] flipAndInvertImage(int[][] A) {
int m=A[0].length;
for(int i=0;i<A.length;i++){
if(m%2==1){
A[i][m/2]=A[i][m/2]^1;
}
for(int j=0;j<m/2;j++){
A[i][j]=A[i][j]^1;
A[i][m-j-1]=A[i][m-j-1]^1;
int temp=A[i][j];
A[i][j]=A[i][m-j-1];
A[i][m-j-1]=temp;
}
}
return A;
}
}