顺时针打印二位数组

顺时针打印二维数组

题目简述

  • 给定一个N*M的整型二维数组,要求以(0,0)为起点,由外层向内层,按顺时针方向依次输出全部元素
    例如矩阵
    1 2 3 4
    5 6 7 8
    9 10 11 12
    13 14 15 16

解题思路

方案 是一圈一圈打印
在写代码过程中要注意矩阵中下标的记录

先设定好边界,行、列,还有初始值。设定好边界后,用while去遍历打印的动作,先右后下再左再上,这个顺时针的动作,因为你会发现其实顺时针的规律也就这样,只要重复循环这个动作即可得出答案。

  • 顺时针输出全部元素,第一步就要先打印出上边一条边(即matrix[0][0]~matrix[0][N-1]);
    //上边一条边  
    while (leftUpCol <= rightDownCol) {
    System.out.println(matrix[leftUpRow][leftUpCol++] + " ");
    }
    //恢复
    leftUpCol = rightDownCol;
    leftUpRow++;
    
  • 第二步打印出右边一条边(即matrix[1][N-1]~matrix[N-1][N-1]);
        //右边一条便边
        while (leftUpRow <= rightDownRow) {
            System.out.println(matrix[leftUpRow++][leftUpCol]);
        }
        //恢复
        leftUpRow = rightDownRow;
        leftUpCol--;
    
  • 第三步打印出下边一条边(即array[n-1][n-2]~array[n-1][0]);

    下边一条边是列在减少
    则leftUpRow需要 >= 0
    所以要重新将指针赋值,并将后边的指针变量进行修改

        //下边一条边
        while (c >= leftUpCol) {
            System.out.println(matrix[r][c--]);
        }
        //恢复
        c = leftUpCol;
        r--;
    
  • 第四步打印出左边一列(即array[0][n-2]~array[1][0]).
    while (r > leftUpRow){
            System.out.println(matrix[r--][c]);
        }
    
  • 至此,已经将二维数组的最外围打印出来了,将最外围的数组元素去除之后,可以发现里面的数组是一个新的二维数组,所以,可以用递归来实现。

应该数据初始化之后继续加上一个while循环
并且leftUpRow和leftUpCol应该递增,rightDownRow和rightDownCol应该递减
在外循环中r和c应该每次都进行初始化

while (leftUpRow <= rightDownRow && leftUpCol <= rightDownCol) {……};

源代码

public class Case01_Print2DArr {
  public static void main(String[] args) {
      int[][] matrix = {
              {1, 2, 3, 4},
              {5, 6, 7, 8},
              {9, 10, 11, 12},
              {13, 14, 15, 16},
      };
      print(matrix);
  }

  static void print(int[][] matrix) {
      int leftUpRow = 0, leftUpCol = 0;//设置好边界值
      rightDownRow = matrix.length - 1;//行 
      rightDownCol = matrix[0].length - 1;//列
      while (leftUpRow <= rightDownRow && leftUpCol <= rightDownCol) {//设置边界,且遍历
          int r = leftUpRow, c = leftUpCol;//更新步骤的初始值
          //上边一条边
          while (c <= rightDownCol) {
              System.out.println(matrix[r][c++]);
          }
          //恢复
          c = rightDownCol;
          r++;

          //右边一条便边
          while (r <= rightDownRow) {
              System.out.println(matrix[r++][c]);
          }
          //恢复
          r = rightDownRow;
          c--;

          //下边一条边
          while (c >= leftUpCol) {
              System.out.println(matrix[r][c--]);
          }
          //恢复
          c = leftUpCol;
          r--;

          while (r > leftUpRow) {
              System.out.println(matrix[r--][c]);
          }
          leftUpRow++;
          leftUpCol++;
          rightDownRow--;
          rightDownCol--;

      }
  }
}

测试结果

1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10

注意

  • 在最初写的代码举的例子一定是很特殊或者很规整的,所以写完代码之后应该学会去修改数据测试代码的可行性
  • 写代码的逻辑一定要非常清楚,并且变量的命名最好使用意思明确的一串字符来表示
  • 在写代码之前要保持思路清晰,把大的问题拆解成一个个小的问题逐一解决
  • 编程要学会多多思考多多优化自己的代码
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要顺时针输出二维数组,可以按照以下步骤进行: 1. 初始化四个边界变量:top、bottom、left、right,分别表示当前输出的上边界、下边界、左边界和右边界。 2. 初始化一个变量dir,表示当前遍历的方向,初始值为0,表示向右遍历。 3. 使用一个循环,直到上边界大于下边界或左边界大于右边界为止: - 如果dir为0,依次输出上边界的元素,然后将上边界下移一行,即top加1。 - 如果dir为1,依次输出右边界的元素,然后将右边界左移一列,即right减1。 - 如果dir为2,依次输出下边界的元素,然后将下边界上移一行,即bottom减1。 - 如果dir为3,依次输出左边界的元素,然后将左边界右移一列,即left加1。 - 每次输出完一个边界后,需要更新dir的值为(dir+1)%4,以改变遍历的方向。 4. 完成遍历后即可得到顺时针输出的结果。 以下是使用Python实现的代码示例: ```python def clockwisePrint(matrix): if not matrix: return [] top, bottom = 0, len(matrix) - 1 left, right = 0, len(matrix[0]) - 1 dir = 0 res = [] while top <= bottom and left <= right: if dir == 0: for i in range(left, right + 1): res.append(matrix[top][i]) top += 1 elif dir == 1: for i in range(top, bottom + 1): res.append(matrix[i][right]) right -= 1 elif dir == 2: for i in range(right, left - 1, -1): res.append(matrix[bottom][i]) bottom -= 1 else: for i in range(bottom, top - 1, -1): res.append(matrix[i][left]) left += 1 dir = (dir + 1) % 4 return res ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值