关于数组的旋转问题
1、给定一个N*N的数组,让其顺时针旋转九十度,输出旋转后的数组(携程2018研发岗笔试第二题)
分析:这个只涉及二维数组纵横坐标的交换,所以只用考虑数组的i,j之间的关系即可,附图(字丑勿嫌弃哈哈😄)
1 package com.xiecheng; 2 //携程笔试第二题:给定一个N*N的数组,让其顺时针旋转九十度(此方法是申请了一个N*N的额外空间) 3 import java.util.Scanner; 4 /* 5 * 你要在最后输入一个非Int类型的值,不然控制台一直以为你没有输入结束,一直等待。例如2 3 1 4 2 c 6 * 在扫描到最后一个c时,Scanner.hasNextInt()为false,如果只是输入2 3 1 4 2程序会一直等待 7 */ 8 9 public class Main { 10 11 public static void round(int arr[][]){ 12 int arr1[][] = new int[arr[1].length][arr.length]; 13 int index = arr.length-1; 14 for(int i=0;i<arr.length;i++,index--){ 15 for(int j=0;j<arr[1].length;j++){ 16 arr1[j][index] = arr[i][j];17 } 18 } 19 print(arr1); 20 } 21 //输出 22 public static void print(int arr[][]){ 23 for(int i=0;i<arr.length;i++){ 24 for(int j=0;j<arr[1].length;j++){ 25 System.out.print(arr[j][i]); 26 } 27 System.out.println(" "); 28 } 29 } 30 31 public static void main(String[] args) { 32 Scanner s = new Scanner(System.in); 33 int arr[][] = new int[3][3]; 34 for(int i=0;i<3;i++){ 35 for(int j=0;j<3;j++){ 36 arr[j][i] = s.nextInt(); 37 } 38 } 39 round(arr); 40 } 41 }
2、一个二维矩阵进行逆置操作,也就是行变列列变行
如下图:
代码:
1 package com.test1; 2 3 public class Change1 { 4 public static void transpose(){ 5 int a[][]={{1,2,3},{4,5,6},{7,8,9}}; 6 System.out.println("转置前:"); 7 for(int i=0; i<=2;i++){ 8 for(int j=0;j<=2;j++ ){ 9 System.out.print(a[i][j]+"("+i+j+")\t"); 10 } 11 System.out.println(); 12 } 13 //转置 14 for(int i=0; i<=2;i++){ 15 for(int j=0;j<=i;j++ )//注意只能遍历一半,所以j<=i,如果全部遍历,则数据交换了两次,相当于没有置换 16 { 17 int temp; 18 temp=a[i][j]; 19 a[i][j]=a[j][i]; 20 a[j][i]=temp; 21 } 22 } 23 System.out.println("转置后"); 24 for(int i=0; i<=2;i++){ 25 for(int j=0;j<=2;j++ ){ 26 System.out.print([i][j]+"("+i+j+")\t"); 27 } 28 System.out.println(); 29 } 30 } 31 32 public static void main(String[] args) { 33 transpose(); 34 } 35 }
3、顺时针打印矩阵
具体:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
分析:
时间有点晚,后续再写