力扣原题链接:https://leetcode-cn.com/problems/rotate-image/
大家可以先记住规律:
旋转90° 先水平旋转(上下交换位置) 后对角线交换
旋转180° 先上下交换位置 后左右交换位置 或者先左右 后上下
旋转270° 先转置 在上下
旋转90°
解法1: 分析其位置变化 找出规律 代码如下:
public static int[][] reverse(int[][] arr){
int n=arr.length-1;
//用需要反转arr.length/2次
for (int i = 0; i <arr.length / 2; i++) {
for (int j = i; j < n-i; j++) {
int temp=arr[i][j];
arr[i][j]=arr[n-j][i];
arr[n-j][i]=arr[n-i][n-j];
arr[n-i][n-j]=arr[j][n-i];
arr[j][n-i]=temp;
}
}
return arr;
}
解法2:
旋转90° 先水平旋转 后对角线交换
/*
法二: 旋转90° 先水平旋转 后对角线交换
*/
public static int[][] reverse(int[][] arr){
//水平旋转 上下交换
for (int i = 0; i < arr.length/2; i++) {
for (int j = 0; j < arr[i].length; j++){
int temp=arr[i][j];
arr[i][j]=arr[arr.length-1-i][j];
arr[arr.length-1-i][j]=temp;
}
}
//对角线交换
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j <i; j++) {
int temp=arr[i][j];
arr[i][j]=arr[j][i];
arr[j][i]=temp;
}
}
return arr;
旋转180° 先上下交换位置 后左右交换位置 或者先左右 后上下
//旋转180° 先上下 后左右 或者先左右 后上下
public static int[][] reverse1(int[][] arr){
//上下
for (int i = 0; i < arr.length/2; i++) {
for (int j = 0; j < arr[i].length; j++) {
int temp=arr[i][j];
arr[i][j]=arr[arr.length-1-i][j];
arr[arr.length-1-i][j]=temp;
}
}
//左右
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length/2; j++) {
int temp=arr[i][j];
arr[i][j]=arr[i][arr.length-1-j];
arr[i][arr.length-1-j]=temp;
}
}
return arr;
}
旋转270° 先转置 在上下
//旋转270° 先转置 在上下
public static int[][] reverse2(int[][] arr){
//对角线交换
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j <i; j++) {
int temp=arr[i][j];
arr[i][j]=arr[j][i];
arr[j][i]=temp;
}
}
//水平旋转
for (int i = 0; i < arr.length/2; i++) {
for (int j = 0; j < arr[i].length; j++){
int temp=arr[i][j];
arr[i][j]=arr[arr.length-1-i][j];
arr[arr.length-1-i][j]=temp;
}
}
return arr;
}