zoukankan      html  css  js  c++  java
  • Spiral Matrix

    题目:

    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(); } } }

      效果图:

  • 相关阅读:
    217. 存在重复元素
    189. 旋转数组
    122. 买卖股票的最佳时机 II
    26. 删除排序数组中的重复项
    [剑指Offer]二进制中1的个数
    [Unity]Unity更改黑色主题(个人版)
    [Unity]限制两个物体之间的距离
    [Untiy]贪吃蛇大作战(五)——游戏主界面
    sql server 函数详解(3)数据类型转换函数和文本图像函数
    sql server 函数详解(2)数学函数
  • 原文地址:https://www.cnblogs.com/udld/p/4195483.html
Copyright © 2011-2022 走看看