“之”字形打印矩阵

之字形打印矩阵

题目:

给定一个矩阵matrix,按照之字形打印这个矩阵
|1|2|3
|4|5|6
|7|8|9
打印的结果就是1,2,4,7,5,3,6,8,9。
要求:额外空间复杂度为O(1)

public static void printMatrixZigZag(int[][] matrix)
{
	int tr = 0;
	int tc = 0;
	int dr = 0;
	int dc = 0;
	int endr = matrix.length()-1;
	int endc = matrix[0].length-1;
	boolean fromUp = false;
	while(tr != endr+1)
	{
		printLevel(matrix, tr, tc, dr, dc, fromUp);
		tr = tc == endc ? tr+1 : tr;
		tc = tc == endc ? tc : tc+1;
		dr = dr == endr ? dr : dr+1;
		dc = dr == endr ? dc+1 : dc;
		fromUp = !fromUp;
	}
	System.out.printLn();
}

//从右上角向左下角打印或从左下角向右上角打印
public static void printLevel(int[][] m, int tr, int tc, int dr, int dc, boolean f)
{
	if(f)
	{
		while(tr != dr+1)
		{
			System.out.printLn(m[tr++][tc--] + " ");
		}
	}
	else
	{
		while(dr != tr-1)
		{
			System.out.printLn(m[dr--][dc++] + " ");
		}
	}
}
解释如下:

通过设置一个A(tr, tc)点和B(dr, dc)点,A代表右上角的点,B代表左下角的点,之字形打印就是将AB连起来,打印AB连线上的所有数,设置一个布尔变量fromUp调整打印的方向,A和B单独运动,每次A往右移动,如果A的行tr<endr,说明A可以向右移动,也就是tr=tr,tc=tc+1,若tr==endr,说明A只能向下移动了,也即tr=tr+1,tc = tc。同理可以分析B点的运动轨迹,B点向下移动,移动到最下方之后开始向右移动。
上述代码巧妙的运动了四个三目运算符来取代一系列的if判断语句,当然不是我写的,但是值得我去学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值