Cracking the coding interview--Q1.6
来源:互联网 发布:插画比赛 知乎 编辑:程序博客网 时间:2024/05/21 00:18
原文:
Given an image represented by an NxN matrix, where each pixel in the image is 4 bytes, write a method to rotate the image by 90 degrees. Can you do this in place?
译文:
一张图像表示成NxN的矩阵,图像中每个像素是4个字节,写一个函数把图像旋转90度。 你能原地进行操作吗?(即不开辟额外的存储空间)
假设矩阵顺时针旋转90度,假设测试数据如下:
1 2 3 4 13 9 5 15 6 7 8 ==> 14 10 6 29 10 11 12 15 11 7 3 13 14 15 16 16 12 8 4
方法一:
数组下标0开始,旋转规律:(i,j)->(j,n-1-i)->(n-1-i,n-1-j)->(n-i-j,i)->(i,j)
也就是说开始坐标(i,j)转向(j,n-1-i),(j,n-1-i)转向(n-1-i,n-1-j)类推
/** * 顺时针旋转90度 * 数组下标0开始,旋转规律:(i,j)->(j,n-1-i)->(n-1-i,n-1-j)->(n-i-j,i)->(i,j) * 也就是说开始坐标(i,j)转向(j,n-1-i),(j,n-1-i)转向(n-1-i,n-1-j)类推 * * 去除重复选装数字 */public static void rotateArray(int array[][], int n) {int tem;for(int i=0; i<n/2; i++) {for(int j=i; j<n-1-i; j++) {tem = array[i][j];array[i][j] = array[n-1-j][i];array[n-1-j][i] = array[n-1-i][n-1-j];array[n-1-i][n-1-j] = array[j][n-1-i];array[j][n-1-i] = tem;}}}
方法二:
第一步交换主对角线两侧的对称元素,第二步交换第j列和第n-1-j列
/** * 规律:第一步交换主对角线两侧的对称元素,第二步交换第j列和第n-1-j列 */public static void rotateArray2(int array[][], int n) {int tem;// 主对角线两侧的对称元素for (int i = 1; i < n; i++) {for (int j = 0; j < i; j++) {tem = array[i][j];array[i][j] = array[j][i];array[j][i] = tem;}}for(int j=0; j<n/2; j++) {for(int i=0; i<n; i++) {tem = array[i][j];array[i][j] = array[i][n-1-j];array[i][n-1-j] = tem;}}}
主要代码如下:
package chapter_1_arraysandstring;import java.util.Scanner;/** * 一张图像表示成NxN的矩阵,图像中每个像素是4个字节,写一个函数把图像旋转90度。 你能原地进行操作吗?(即不开辟额外的存储空间) * * @author LiangGe * */public class Question_1_6 {/** * 顺时针旋转90度 数组下标0开始,旋转规律:(i,j)->(j,n-1-i)->(n-1-i,n-1-j)->(n-i-j,i)->(i,j) * 也就是说开始坐标(i,j)转向(j,n-1-i),(j,n-1-i)转向(n-1-i,n-1-j)类推 * * 去除重复选装数字 */public static void rotateArray(int array[][], int n) {int tem;for (int i = 0; i < n / 2; i++) {for (int j = i; j < n - 1 - i; j++) {tem = array[i][j];array[i][j] = array[n - 1 - j][i];array[n - 1 - j][i] = array[n - 1 - i][n - 1 - j];array[n - 1 - i][n - 1 - j] = array[j][n - 1 - i];array[j][n - 1 - i] = tem;}}}/** * 规律:第一步交换主对角线两侧的对称元素,第二步交换第j列和第n-1-j列 */public static void rotateArray2(int array[][], int n) {int tem;// 主对角线两侧的对称元素for (int i = 1; i < n; i++) {for (int j = 0; j < i; j++) {tem = array[i][j];array[i][j] = array[j][i];array[j][i] = tem;}}for(int j=0; j<n/2; j++) {for(int i=0; i<n; i++) {tem = array[i][j];array[i][j] = array[i][n-1-j];array[i][n-1-j] = tem;}}}/** * 规律:第一步交换副对角线两侧的对称元素,第二步交换第i行和第n-1-i行 */public static void rotateArray3(int array[][], int n) {int tem;for(int i=0; i<n-1; i++) {for(int j=0; j<n-1-i; j++) {tem = array[i][j];array[i][j] = array[n-1-j][n-1-i];array[n-1-j][n-1-i] = tem;}}for(int i=0; i<n/2; i++) {for(int j=0; j<n; j++) {tem = array[i][j];array[i][j] = array[n-1-i][j];array[n-1-i][j] = tem;}}}/** * 打印矩阵 */public static void printArray(int array[][], int n) {for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {System.out.printf("%3d", array[i][j]);}System.out.println();}}public static void main(String args[]) {Scanner scanner = new Scanner(System.in);int number = Integer.parseInt(scanner.nextLine());// number测试组while (number-- > 0) {String curStrLine = scanner.nextLine();String[] curStr = curStrLine.split(" ");int n = Integer.parseInt(curStr[0]);int array[][] = new int[n][n];for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {array[i][j] = scanner.nextInt();}scanner.nextLine();}System.out.println("before rotate ....");printArray(array, n);// 顺时针旋转90度rotateArray3(array, n);System.out.println("after rotate ....");printArray(array, n);}}}
0 0
- Cracking the coding interview--Q1.6
- Cracking the coding interview--Q1.6
- Cracking the coding interview--Q1.6
- Cracking the coding interview--Q1
- 【Cracking the coding interview】Q1.6(旋转矩阵)
- Cracking The Coding Interview--Q1.1
- Cracking the coding interview Q1.1
- Cracking the coding interview--Q1.1
- Cracking the coding interview Q1.1
- Cracking the coding interview Q1.2
- Cracking the coding interview Q1.1
- Cracking the coding interview--Q1.8
- Cracking the Coding Interview Chap1 Q1.1
- Cracking the Coding Interview Chap1 Q1.2
- Cracking the Coding Interview Chap1 Q1.3
- Cracking the Coding Interview Chap1 Q1.4
- Cracking the Coding Interview Chap1 Q1.5
- Cracking the coding interview--Q1.1
- 仓库管理(同步与互斥)
- Android加密算法之MD5加密
- 个人总结
- 编程面试的10大算法概念汇总
- java路径处理(jar包中的路径处理)
- Cracking the coding interview--Q1.6
- javascript基础1语法
- SCP命令
- 跟我一起写 Makefile(精华帖合辑)之——提高篇
- Java 1020
- java如何提取字符串中不连续数字进行操作
- hdu 5033 Building 2014 ACM/ICPC Asia Regional Beijing Online
- C#-循环滚动字幕,timer,从左至右,从右至左,暂停---ShinePans
- 关于网络字节序和主机字节序