《程序员面试金典》之像素翻转

1、题目描述

有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度。给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵,保证N小于等于500,图像元素小于等于256。

测试样例:
[[1,2,3],[4,5,6],[7,8,9]],3
返回:[[7,4,1],[8,5,2],[9,6,3]]
 

2、代码实现

 1 import java.util.*;
 2 
 3 public class Transform {
 4     
 5     private static int num = 0; // 记录阶数
 6     
 7     /**
 8      * 将图像顺时针旋转90度
 9      * @param mat 原来的二维数组
10      * @param n 阶数
11      * @return 旋转90度后二维数组
12      */
13     public int[][] transformImage(int[][] mat, int n) {
14         int[][] temp = new int[n][n];
15         
16         for(int i = 0; i < n; i++){
17             int tempNum = 0;
18             for(int j = n-1; j >= 0; j--){
19                 temp[i][tempNum] = mat[j][i];
20                 tempNum++;
21             }
22         }
23         return temp;
24     }
25     
26     /**
27      * 通过给定的字符串,获取新的二维数组
28      * @param str 给定的字符串
29      * @return 新的二维数组
30      */
31     public static int[][] getIntArray(String str){
32         String strResult = "";
33 
34         // 提取无'['和']'的子字符串
35         for(int i = 0; i < str.length(); i++){
36             if(str.charAt(i) == '[' || str.charAt(i) == ']'){
37                 continue;
38             }
39             strResult += str.charAt(i);
40         }
41         
42         String[] strings = strResult.split(",");    // 分离字符串,存入字符数组里面
43         num = Integer.parseInt(strings[strings.length-1]);
44         int[][] arr = new int[num][num];
45         int temp = 0;
46         // 将字符数组转化成整型数组
47         for(int i = 0; i < num; i++){
48             for(int j = 0; j < num; j++){
49                 arr[i][j] = Integer.parseInt(strings[temp]);
50                 temp++;
51             }
52         }
53         return arr;
54     }
55     
56     /**
57      * 打印出结果
58      * @param arr 旋转后的二维数组
59      */
60     public void print(int[][] arr){
61         System.out.print("[");
62         for(int i = 0; i < arr.length; i++){
63             System.out.print(Arrays.toString(arr[i]));
64             if(i != arr.length - 1){
65                 System.out.print(",");
66             }
67         }
68         System.out.println("]");
69     }
70     
71     /**
72      * 用户页面测试
73      * @param args
74      */
75     public static void main(String[] args) {
76         
77         Transform t = new Transform();
78         String str = "[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16],4"; // 给定待测试的字符串
79         int[][] mat = Transform.getIntArray(str);                           // 由字符串提取二维数组
80         int[][] arr = t.transformImage(mat, num);                          // 获取旋转90度后的二维数组
81         t.print(arr);                                                      // 打印出旋转90度后的结果
82     }
83 }
原文地址:https://www.cnblogs.com/wangchaoyuan/p/5965355.html