题目描述:
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
示例1:
![](https://img-blog.csdnimg.cn/img_convert/f874ab5d157e91a60f945166dc956cea.jpeg)
![](https://img-blog.csdnimg.cn/img_convert/75091fd7c0a0f6ce050a816c6f55f3d0.png)
示例2:
![](https://img-blog.csdnimg.cn/img_convert/65ad52c71fc4228d4a6c01bb51ad343b.jpeg)
![](https://img-blog.csdnimg.cn/img_convert/7f277723922cb767355348f3a6902328.png)
思路:
使用翻转操作代替旋转操作
以例2来做演示:
![](https://img-blog.csdnimg.cn/img_convert/a15ea7cbd3a6b62fbc10da2c51b49e8e.png)
首先通过水平轴进行翻转:
![](https://img-blog.csdnimg.cn/img_convert/39b057ddbcb34515ff2240109558f937.png)
其实根据主对角线进行翻转:
![](https://img-blog.csdnimg.cn/img_convert/d846e7f7a6e7875a40aea97c626dbf97.png)
package Lq_算法练习;
import java.util.Scanner;
public class Demo_旋转图像 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[][] arr=new int[n][n];
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
arr[i][j]=sc.nextInt();
}
}
rotate(arr);
printArr(arr);
}
public static void rotate(int[][] arr) {
//获取矩形的边长数
int n=arr.length;
//1.进行水平翻转
for(int i=0;i<n/2;i++) {
//2.内循环,对列进行操作
for(int j=0;j<n;j++) {
//3.对数组对应元素进行交换
int temp=arr[i][j];
arr[i][j]=arr[n-i-1][j];
arr[n-i-1][j]=temp;
}
}
//4.主对角线元素进行交换
for(int i=0;i<n;i++) {//每一行都得交换
for(int j=0;j<i;j++) {//对当前行的元素进行对角线旋转
int temp=arr[i][j];
arr[i][j]=arr[j][i];
arr[j][i]=temp;
}
}
}
public static void printArr(int[][] arr) {
for(int i=0;i<arr.length;i++) {
for(int j=0;j<arr[i].length;j++) {
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}
}
运行结果:
示例1:
![](https://img-blog.csdnimg.cn/img_convert/f7a8c7559a1e7d02af4bcdb4c49c78c7.png)
示例2:
![](https://img-blog.csdnimg.cn/img_convert/8f3ded111b21b7d3a49ec3ca3d6da028.png)