题目:
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
For example,
Given the following matrix:
[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ]
You should return [1,2,3,6,9,8,7,4,5]
.
算法分析:
逐次取得数组螺旋取值位,然后将值赋给新数组。
所以重点是如何确定下一位数组的取值位。
代码: (细节见注释)
import java.lang.reflect.Array; import java.util.Arrays; import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Spiral { public static void main(String[] argv){ int min; int num=0; Scanner in=new Scanner(System.in); int m=Integer.parseInt(in.nextLine()); //获取行 int n=Integer.parseInt(in.nextLine()); //获取列 String [][] k,y; k=new String [m][];y=new String [m][]; //矩阵数组 for(int i=0;i<m;i++){ k[i]=new String[n]; y[i]=new String[n]; } for(int i=0;i<m;i++){ k[i]=in.nextLine().split(" "); } min=m>n? n:m; //取行列最小值来确定螺旋圈数 System.out.println(min); for(int i=0; i<(min+1)/2;i++){ //System.out.println("A"); //上:从左到右 for(int j=i;j<=n-1-i;j++){ //System.out.println(k[i][j]); int u=num/n; int v=num%n; y[u][v]=k[i][j]; num++; } //System.out.println("B"); //右:从上到下 for(int p=i+1;p<m-1-i;p++){ //System.out.println(k[p][n-1-i]); int u=num/n; int v=num%n; y[u][v]=k[p][n-1-i]; num++; } //System.out.println("C"); //下:从右向左 for (int q=n-1-i;q>=i;q--){ if(!(i==m-1-i)){ //最后一圈仅一行时,“下:从右向左”与“上:从左向右”重合 //System.out.print(k[m-1-i][q]); int u=num/n; int v=num%n; y[u][v]=k[m-1-i][q]; num++; } } //System.out.println("D"); for(int r=m-1-i-1;r>i;r--){ //左:从下向上 if(!(i==n-1-i)){ //最后一圈仅一列时,特殊情况,“左:从下向上”和“右:从上到下”重合。
//System.out.println(k[r][i]); int u=num/n; int v=num%n; y[u][v]=k[r][i]; num++; } } } for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ System.out.print(y[i][j]+" "); } System.out.println(); } } }
效果图: