顺时针打印矩阵

题目

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

思路

顺时针循环打印
一个大循环:由行数与列数的最小值决定
四个小循环:从左至右,从上至下,从右至左,从下至上
难点在于边界的确定
代码参考牛客网weizeier

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
        ArrayList<Integer> list = new ArrayList<>();
        int m = matrix.length;
        int n = matrix[0].length;
        int i=0, j=0;
        //int count = m < n ? (m-1)/2+1:(n-1)/2+1;这样求,最后结果有问题,用Idea验证没有问题,?? 可能是冒号两边的加法未加括号,不确定计算顺序,一定要加括号
        int count = (Math.min(n,m)-1)/2+1;//大循环次数,可以画图验证
        for(int k=0; k<count; k++){
            for(j=k; j<n-k; j++){
               list.add(matrix[k][j]);
            }
            for(i=k+1; i<m-k; i++){
            list.add(matrix[i][n-1-k]);
            }
            for(j=n-k-2;(j>=k)&&(m-k-1!=k); j--){ //(m-k-1!=k)单行
            list.add(matrix[m-k-1][j]);
            }
            for(i=m-k-2;(i>k)&&(n-k-1!=k); i--){ //(n-k-1!=k)单列
            list.add(matrix[i][k]);
            }
        }  
        return list;
       }
    }

同思路,另一种实现方法

链接:https://www.nowcoder.com/questionTerminal/9b4c81a02cd34f76be2659fa0d54342a
来源:牛客网

public ArrayList<Integer> printMatrix(int [][] matrix) {
       ArrayList<Integer> list = new ArrayList<Integer>();
        int row = matrix.length-1;
        int col = matrix[0].length-1;

        for (int i = 0; i * 2 <= row && i * 2 <= col; i++) {
            cir(list, i, row-i, col-i, matrix);
        }

        return list;
    }

    void cir(ArrayList<Integer> list, int start, int row, int col, int[][] matrix) {
        for (int i = start; i <= col; i++) {
            list.add(matrix[start][i]);
        }
        if (start == row) 
            return;
        for (int i = start+1; i <= row; i++) {
            list.add(matrix[i][col]);
        }
        if (start == col) {
            return;
        }
        for (int i = col-1; i >= start; i--) {
            list.add(matrix[row][i]);
        }
        for (int i = row-1; i >= start+1; i--) {
            list.add(matrix[i][start]);
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值