剑指offer-面试题20-顺时针打印矩阵

package case20_PrintMatrixClockWisely;

public class PrintMatrixClockWisely {
	 /**
	 * 题目:输入一个矩阵,按照从外向里以顺时针的顺序打印出每一个数字。
	 * 思路:
	 * 循环打印:
	 * 	1:先打印一行(第1行肯定会打印)
	 * 	2:再打印当前矩阵的最后一列
	 * 	3:再倒序打印当前矩阵的最后一行
	 * 	4:再倒序打印当前矩阵的第一列
	 * 起始坐标的规律:
	 * 		(0,0),(1,1),(2,2)...(startX,startY),起始坐标的两个坐标值相等。
	 * 		并且 startX<= (rows-1)/2,startY<=(columns-1)/2
	 * 当前矩阵,第1行 坐标 (start,columns-1-start)		=>	(start,endX)
	 * 当前矩阵,最后1列 坐标 (start+1,rows-1-start)	=>	(start+1,endY)
	 * 当前矩阵,最后1行 坐标 (start,columns-1-start+1)	=>	(start,endX-1)
	 * 当前矩阵,第1行 坐标 (start+1,columns-1+1)		=>	(start+1,endY-1)
	 * @author WangSai
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 初始化矩阵 arr[][]
		int[][] arr = new int[5][6];
		for (int i = 0; i < arr.length; i++) {
			int tmp = i * 2;
			for (int j = 0; j < arr[0].length; j++) {
				arr[i][j] = i * 6 + j;
				System.out.print(arr[i][j] + " " + '\t');
			}
			System.out.println();
		}
		System.out.println("顺时针打印矩阵:");
		// 顺时针打印矩阵 arr[][]
		printMatrixWisely(arr);
	}

	// 循环打印
	public static void printMatrixWisely(int[][] arr) {
		if (arr == null || arr.length < 1 || arr[0].length < 1)
			return;
		int start = 0;
		int rows = arr.length;
		int columns = arr[0].length;
		while (2 * start < columns && 2 * start < rows) {
			printMatrix(arr, rows, columns, start);
			start++;
		}
	}

	// 打印一圈
	public static void printMatrix(int[][] arr, int rows, int columns, int start) {
		int endX = columns - 1 - start; // 最后一列的列号
		int endY = rows - 1 - start; // 最后一行的行号
		// 打印该圈第一行
		for (int i = start; i <= endX; i++)
			System.out.print(arr[start][i] + " ");
		// 打印该圈最后一列 (至少是两行)
		if (start < endY)
			for (int i = start + 1; i <= endY; i++)
				System.out.print(arr[i][endX] + " ");
		// 打印该圈最后一行 (至少是两行两列)
		if ((start < endX) && (start < endY))
			for (int i = endX - 1; i >= start; i--)
				System.out.print(arr[endY][i] + " ");
		// 打印该圈的第一列 (至少是三行两列)
		if ((start < endX) && (start < endY - 1))
			for (int i = endY - 1; i >= start + 1; i--)
				System.out.print(arr[i][start] + " ");
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值