给定一个包含 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;

        }
    }
}

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值