【Java】顺时针打印二维数组

 思路:以左上顶点(leftUpRow,leftUpCol) 和 右下顶点(rightDownRow,rightDownCol)为基准,按             照上层,右层,下层,左层遍历输出

来自《算法很美》 原版代码案例不能能全部通过(稍加改进)


public class Dome3 {
	public static void main(String[] args) {
		int[][] nums = {
				        {1,2,3,4},
				        {5,6,7,8},
			         	{9,10,11,12}
			         };
		//左上顶点和右下顶点
		int leftUpRow = 0,leftUpCol = 0,rightDownRow = nums.length - 1,
            rightDownCol = nums[0].length - 1;

        //当左上顶点和右下顶点收缩至交叉时,退出最外层While循环
		while(leftUpRow <= rightDownRow && leftUpCol <= rightDownCol) {
		int r = leftUpRow,c = leftUpCol;
		//上层
		while(c <= rightDownCol) {
			System.out.print(nums[r][c++] + " ");
		}
		c = rightDownCol; //恢复 因为该while循环完,由于c++是后++ 故c必然大于rightC
		r++;             //接下来需要输出右层元素,r需要+1
		if(r > rightDownRow) { //判断
			break;
		}
		
		//右层
		while(r <=rightDownRow) {
			System.out.print(nums[r++][c] + " ");
		}
		r = rightDownRow;  //恢复 因为该while循环结束后,由于r++是后++,故r必然大于rightR
		c--;                
		if(c < leftUpCol) {
			break;
		}
		//下层
		while(c >= leftUpCol) {
			System.out.print(nums[r][c--] + " ");
		}
		c = leftUpCol;   //恢复 因为该while循环结束后,由于c++是后++,故c必然大于leftC
		r--;
		if(r < leftUpRow) {  //判断
			break;
		}
		//左层
		while(r > leftUpRow) {
			System.out.print(nums[r--][c] + " ");
		}
		leftUpRow++;   //将左上顶点和右下顶点收缩,重复以上操作
		leftUpCol++;
		rightDownRow--;
		rightDownCol--;
	  }
	}
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值