给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

目录

    • 题目
    • 解题思路
    • 程序实现

题目

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

解题思路

 arr[a][b]
 01 02 03 04 05 06   
 16 17 18 19 20 07                             
 15 24 23 22 21 08   
 14 13 12 11 10 09                             
 第一次 右移6位 数组列长                    
 第二次 下移3位                                              
 第三次  左移5位  
 第四次 上移两位                
 第五次  右移4位
 第六次  下移1位
 第七次  左移3位
 第八次   下移0位

水平方向上的运动:
第一次 右移6位
第三次 左移5位
第五次 右移4位
第七次 左移3位
第八次 下移0位

   int moveRight  = arr[0].length; //水平方向上的移动步数

moveRight水平方向上的移动步数,每次运动方向改变,通过flag来控制。每次运动完后下次移动步数减一。

竖直方向上的运动
第二次 下移3位
第四次 上移两位
第六次 下移1位

int moveDown = arr.length-1;//竖直方向上的移动步数

moveDown方向上的移动步数,每次运动方向改变,通过flag来控制。每次运动完后下次移动步数减一。

水平运动和竖直运动交替进行,以一次水平运动和一次竖直运动为一组,进行运动,听过flag变量来控制变化的方向,循环,知道有水平运动移动步数或竖直运动移动步数减为0,则循环结束。

程序实现


public class Test04 {
     

    public static void main(String[] args) {
     
        int[][] arr = new int[][] {
     {
     1,2,3,4,5,6},
                {
     16,17,18,19,20,7},
                {
     15,24,23,22,21,8},
                {
     14,13,12,11,10,9}};
        print(arr);


    }
    /**
     * 请按照顺时针螺旋顺序,返回矩阵中的所有元素。
     *
     *    arr[a][b]
     *    01 02 03 04 05 06    第一次 右移6位 数组列长
     *    16 17 18 19 20 07                             第二次 下移3位
     *    15 24 23 22 21 08    第三次  左移5位
     *    14 13 12 11 10 09                             第四次  上移2位
     *                         第五次  右移4位
     *                                                  第六次  下移1位
     *                         第七次  左移3位
     *                                                  第八次   下移0位
     *   变量  moveRight  = arr[0].length;水平方向上的移动步数
     *   正数右移,负数左移
     *   先做水平运动,步数减一
     *   变量  moveDown  = arr.length;
     *   再做垂直运动,步数减1
     *   flag = -1;
     *
     */

    public static void print(int arr[][]){
     
        int moveRight  = arr[0].length; //水平方向上的移动步数
        int indexRight =0; //水平方向上的索引
        int moveDown  = arr.length-1;//竖直方向上的移动步数
        int indexDown =0;//竖直方向上的索引
        int flag = 1;//方向判断

        while(true){
     
            int i = 0;
            int j = 0 ;
            //水平移动
            if(moveRight != 0 ) {
     
                for (i = 0; i < moveRight; i++) {
     
                    System.out.print(arr[indexDown][indexRight + i * flag] + " ");
                }
                //水平移动后水平方向和竖直方向的索引变化
                indexRight += flag * (moveRight - 1);
                indexDown += flag; 
                moveRight--;
            }
            if(moveDown == 0)  break;
            //竖直移动
            if(moveDown != 0) {
     
                for (j = 0; j < moveDown; j++) {
     
                    System.out.print(arr[j * flag + indexDown][indexRight] + "  ");
                }
                //竖直移动后水平方向和竖直方向的索引变化
                indexDown += flag * (moveDown - 1);
                indexRight += flag * (-1);
                moveDown--;
            }
            if(moveRight == 0)  break;
            flag = -flag;

        }
    }
}

你可能感兴趣的:(矩阵,intellij,idea,java)