您的位置:首页 > Web前端

剑指offer_数组---顺时针打印矩阵

2017-08-25 16:06 267 查看

题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.

解题思路

1,首先判断一共可以打印几圈

2,每圈的四行打印的边界条件是什么

代码实现

/**
*
*/
package 数组;

import java.util.ArrayList;

/**
* <p>
* Title:PrintMatrix
* </p>
* <p>
* Description:
* </p>
*
* @author 田茂林
* @data 2017年8月25日 下午2:54:00
*/
public class PrintMatrix {

/**
*
* 循环打印结束条件:当行长度不再大于2倍的左上角列的位置,列的长度不再大于2倍的左上角行的位置
*
* @param args
*/
public ArrayList<Integer> printMatrix(int[][] matrix) {
ArrayList<Integer> list = new ArrayList<Integer>();
if (matrix == null || matrix.length < 1 || matrix[0].length < 1) {
return list;
}
int rows = matrix.length;
int cols = matrix[0].length;
int start = 0;
while (cols > 2 * start && rows > 2 * start) {
helper(matrix, rows, cols, list, start);
start++;
}
return list;

}

public void helper(int[][] matrix, int rows, int cols,
ArrayList<Integer> list, int start) {
int endX = cols - start - 1;  // 列号结束的地方
int endY = rows - start - 1;  // 行标号结束的地方
// 从左到右打印一行
for (int i = start; i <= endX; i++) {
list.add(matrix[start][i]);
}
// 从上到下打印一列,只有终止行号大于起始行号才可以
if (endY > start) {
for (int i = start + 1; i <= endY; i++) {
list.add(matrix[i][endX]);
}
}
// 从右到左打印一行,只有终止行号大于起始行号且终止列号大于起始列号才可以
if (endY > start && endX > start) {
for (int i = endX - 1; i >= start; i--) {
list.add(matrix[endY][i]);
}
}
// 从下到上打印一行,终止列号大于起始列号,终止行号大于起始行号+1才行
if (endY - 1 > start && endX > start) {
for (int i = endY - 1; i > start; i--) {
list.add(matrix[i][start]);
}
}

}

public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
int[][] matrix = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
PrintMatrix p = new PrintMatrix();
list = p.printMatrix(matrix);
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i));
}

}

}


测试结果

123698745
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: