(《劍指Offer》筆記)順時針打印矩陣

聯繫螺旋矩陣那一道題。解題思路都是先畫圖,然後發現螺旋相當於一圈一圈的打印,每一圈的起點都是(i,i)。

public class PrintMatrixInCircle {
//每一圈的起點都是(i,i)
//對於一個m*n的矩陣,最後一圈的起點座標爲min((m-1)/2,(n-1)/2),這是最後一個start的位置。因此m-1>=2*start,n-1>=2*start
	//所以當row>startX*2&&column>startY*2時循環
	
	public static void printMatrixClockWisely(int[][]numbers){
		if(numbers==null)
			return;
		int rows=numbers.length;
		int columns=numbers[0].length;
		int start=0;
		while(rows>start*2&&columns>start*2){
			PrintMatrixInCircle(numbers,start);
			start++;
		}
	}
	/**m*n矩陣,第i圈四個頂點分別是(i.i) (i,n-i-1) (m-i-1,i) (m-i-1,n-i-1)座標系橫軸爲row,縱軸爲column
	 * @param numbers 數組
	 * @param start 每一圈開始的位置
	 */
	private static void PrintMatrixInCircle(int[][] numbers, int start) {
		int rows=numbers.length;
		int columns=numbers[0].length;
		int endR=rows-start-1;
		int endC=columns-start-1;
		//從左到右打印一行
		for(int i=start;i<=endC;i++){
			System.out.println(numbers[start][i]);
		}
		//從上到下打印一列,說明至少兩行
		if(start<endR){
			for(int i=start+1;i<=endR;i++){
				System.out.println(numbers[i][endC]);
			}	
		}
		//從右到左打印一行,說明至少兩行兩列
		if(start<endR&&start<endC){
			for(int i=endC-1;i>=start;i--){
				System.out.println(numbers[endR][i]);
			}	
		}
		//從下到上打印一列,說明至少三行兩列
		if(start<endR-1&&start<endC){
			for(int i=endR-1;i>=start+1;i--){
				System.out.println(numbers[i][start]);
			}	
		}
	}
	public static void main(String[] args) {
		int[][]numbers=new int[][]{{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
		printMatrixClockWisely(numbers);
	}

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章