zoukankan      html  css  js  c++  java
  • 《程序员面试金典》之像素翻转

    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 }
  • 相关阅读:
    VMWare ESX Server
    ubuntu 13.04 xrdp 远程桌面连接问题[转载]
    wget 使用技巧
    C# 跨线程调用问题
    ASP.NET WEB API 返回JSON 出现2个双引号问题
    ASP.NET MVC 4 中Razor 视图中JS无法调试
    Android 如何修改gen下包的名字
    打开AVD时报”Data partition already in use. Changes will not persist!”
    Android 将APK文件安装到AVD中并分析其界面结构
    Android 实现界面(Activity)的跳转
  • 原文地址:https://www.cnblogs.com/wangchaoyuan/p/5965355.html
Copyright © 2011-2022 走看看