【剑指offer】顺时针打印数组总结

哈哈 阅读:347 2022-03-12 16:24:47 评论:0
本文章主要介绍了【剑指offer】顺时针打印数组,具有不错的的参考价值,希望对您有所帮助,如解说有误或未考虑完全的地方,请您留言指出,谢谢!

顺时针打印数组

题意

例如我们有一个二维数组,如下

  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 

思路

设置四个下标,分别代表左上、右上、右下、左下的下标,每次首先从左上遍历到右上,再从右上到右下,接着从右下到左下,再从左下到左上,此时更新这四个下标的值。

值得注意的是当从右下到左下和左下到左上的时候,要注意左右下标和上下下标是否已经相遇了,如果已经相遇就无需再遍历了。

代码

package com.niuke; 
 
import java.util.ArrayList; 
 
/** 
 * Created by puyangsky on 17/3/11. 
 * 顺时针打印数组 
 *  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 
 */ 
public class PrintMatrix { 
    public static ArrayList<Integer> printMatrix(int [][] matrix) { 
        int h = matrix.length; 
        int l = matrix[0].length; 
        ArrayList<Integer> ans = new ArrayList<Integer>(); 
        if (h==0 || l==0) return ans; 
        int left_right = 0; 
        int top_down = 0; 
        int right_left = l-1; 
        int down_top = h-1; 
        while (left_right <= right_left && top_down <= down_top) { 
            //从左至右打印 
            for (int i = left_right; i <= right_left; i++) ans.add(matrix[top_down][i]); 
 
            //从上至下打印 
            for (int i = top_down+1; i <= down_top; i++) ans.add(matrix[i][right_left]); 
 
            //从右至左打印 
            if(top_down < down_top) { 
                for (int i = right_left-1; i >= left_right; i--) ans.add(matrix[down_top][i]); 
            } 
 
            //从下至上打印 
            if(right_left > left_right) { 
                for (int i = down_top-1; i >= top_down+1; i--) ans.add(matrix[i][left_right]); 
            } 
            //更新四个下标的值 
            down_top--;left_right++;right_left--;top_down++; 
        } 
 
        return ans; 
    } 
 
    public static void main(String[] args) { 
        int[][] matrix = { 
                {1,2}, 
                {3,4}, 
                {5,6}, 
                {7,8}, 
                {9,10} 
        }; 
 
        ArrayList<Integer> ans = new ArrayList<Integer>(); 
 
        ans = printMatrix(matrix); 
 
        for(int i : ans) 
            System.out.printf("%d\t", i); 
    } 
} 

结果

1 2 4 6 8 10 9 7 5 3


标签:加密算法
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

我的关注

全民解析

搜索
关注我们