LeetCode_剑指 Offer 29. 顺时针打印矩阵:Java

package LeetCode;
/*
    输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
 */

import java.util.Arrays;

class Solution_29 {
    public int[] spiralOrder(int[][] matrix) {
        if(matrix.length != 0){     //当输入数组不为空时
            int[]  arr = new int[matrix.length * matrix[0].length]; //matrix.length * matrix.length表示一维数组长度

            //遍历的初始位置
            int startX = 0;
            int startY = 0;

            //一维数组的起始位置
            int start_1 = 0;

            //偏移量
            int offset = 1;

            if(matrix.length > 1 && matrix[0].length > 1){  //当数组行和列都大于1时

                //循环次数,仅当行和列都满足时才可以循环
                int times_X = matrix.length / 2;
                int times_Y = matrix[0].length / 2;

                while(times_X > 0  && times_Y > 0){

                    int i = startX;
                    int j = startY;

                    //上侧,从左到右 前闭后开原则[)
                    for(; j < matrix[startY].length - startY - offset; j++){
                        arr[start_1] = matrix[i][j];
                        start_1++;
                    }

                    //右侧,从上到下 前闭后开原则[)
                    for(; i < matrix.length - startX - offset; i++){
                        arr[start_1] = matrix[i][j];
                        start_1++;
                    }


                    //下侧,从右到左 前闭后开原则[)
                    for(; j > startY; j--){
                        arr[start_1] = matrix[i][j];
                        start_1++;
                    }

                    //左侧,从下到上 前闭后开原则[)
                    for(; i > startX; i--){
                        arr[start_1] = matrix[i][j];
                        start_1++;
                    }

                    if(times_X >= 1 || times_Y>=1){     //循环条件
                        times_X--;
                        times_Y--;
                        startX++;
                        startY++;
                    }
                }

                if(startX == matrix.length-1 || startY == matrix[0].length-1){  //当初始位置在数组边缘时,表示遍历完成
                    return arr;
                }

                while(times_X >  times_Y){  //当行数还可以循环,而列数不可以时(及存在某一列还有剩余元素)
                    int x = matrix.length - matrix[0].length + 1;
                    for(int k = 0; k < x; k++){
                        arr[start_1] = matrix[k+startX][startY];
                        start_1++;
                    }
                    return arr;
                }

                while(times_X < times_Y){  //当列数还可以循环,而行数不可以时(及存在某一行还有剩余元素)
                    int x = matrix[0].length - matrix.length + 1;
                    for(int y = 0; y < x; y++){
                        arr[start_1] = matrix[startX][y+startY];
                        start_1++;
                    }
                    return arr;
                }

                while(matrix.length == matrix[0].length && matrix.length % 2 ==1 ){  //输入为正方形矩阵时
                    arr[start_1] = matrix[startX][startY];
                    return arr;
                }

            }else if(matrix.length == 1){       //只有一行时
                for(int i = 0; i < matrix[0].length; i++){
                    arr[start_1++] = matrix[0][i];
                }
            }else if(matrix[0].length == 1){    //只有一列时
                for(int i = 0; i < matrix.length; i++){
                    arr[start_1++] = matrix[i][0];
                }
            }
            return arr;
        }

        //当输入数组为空时
        int[]arr = {};
        return arr;
    }
}

public class offer_29 {
    public static void main(String[] args){
        
        //创建二维数组的方式
        int[][] arr = new int[3][3];    //方式一
        int[][] arr1 = {{2,3,4},{5,6,7},{8,9,10},{11,12,13},{14,15,16}};   //方式二

        int[][] arr2 = {{2,5},{8,4},{0,-1}};
        int[][] arr3= {{1,2,3,4,5,6,7,8,9,10},{11,12,13,14,15,16,17,18,19,20}};

//        System.out.println(arr1.length);    //二维数组的行数
//        System.out.println(arr1[0].length); //二维数组的0行的数量

        Solution_29 sol = new Solution_29();
        int[] ans = sol.spiralOrder(arr1);
        System.out.println(Arrays.toString(ans));
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一蓑烟雨渡平生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值