剑指offer-第19题-顺时针打印矩阵

这个题其实把我搞的有点蒙,我现在都还不是很懂,另一种方法,emm,我就算了吧哈哈,搞不来.我要回宿舍了哈哈,各位明天见!晚安!

/**

  • 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,

  • 例如,如果输入如下4 X 4矩阵: 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.

  • 思路:

  • 一种死办法,好理解,我这里就是死办法,不过也把我整得够呛,因为我有点蠢

  • 一种看他们写的算圈数,圈的计算方法:min(行,列)/2 + 1,就是行和列的较小值除以2然后加1,
    */
    public class Practice19 {

    public static void main(String[] args) {
    Practice19 p = new Practice19();
    int[][] matrix = new int[][]{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
    List lists = new ArrayList<>();
    lists = p.printMatrix(matrix);
    System.out.println(lists);
    }

    public ArrayList printMatrix(int[][] matrix) {
    //行和列
    int row = matrix.length;
    int col = matrix[0].length;
    //定义上下左右四个边
    int top = 0, left = 0, right = col - 1, bottom = row - 1;
    //定义一个放数字的list
    ArrayList resultList = new ArrayList<>();
    while (top <= bottom && left <= right) {
    //最上面一行,从左往右放,列动行不动
    for (int i = left; i <= right; i++) {
    resultList.add(matrix[top][i]);
    }
    //最右边一列,从上往下放,行动列不动
    for (int i = top + 1; i <= bottom; i++) {
    resultList.add(matrix[i][right]);
    }
    //最下面的一行,从右往左放,列动行不动
    //这里要加个判断语句,不然会重复,注意左右移动是判断上下边哦
    if (top != bottom) {
    for (int i = right - 1; i >= left; i–) {
    resultList.add(matrix[bottom][i]);
    }
    }
    //最左边一列,从下往上放,行动列不动
    //这里也是
    if (left != right) {
    for (int i = bottom - 1; i > top; i–) {
    resultList.add(matrix[i][left]);
    }
    }
    //改变四条边的值,下一次循环开始
    top++;
    bottom–;
    left++;
    right–;
    }
    return resultList;
    }
    }
    原文链接:https://www.nowcoder.com/practice/9b4c81a02cd34f76be2659fa0d54342a?tpId=13&tqId=11172&tPage=1&rp=1&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值