六.“之字”形打印矩阵

【题目】

给定一个矩阵matrix,按照“之”字形的方式打印这个矩阵,

【要求】

额外空间复杂度为O(1)。

【举例】

在这里插入图片描述 ### 【输出结果】
1 2 5 9 6 3 4 7 10 11 8 12

【分析】

1.从宏观结构来看,把整体划分为几个箭头部分;
2.从每个箭头表示的数据来看:下一个箭头组边界的数据是上一个箭头组边界数据向下,向右移动得到的;
3.相邻箭头组的输出顺序是不一样的。(实现正确的输出顺序)

【思路】

在这里插入图片描述
1.定义两个位置变量(初始均在(0,0)位置):一个变量位置不断向右,到达最后一列后,向下移动,确定一个边界位置;另一个变量该位置不断向下,到达最后一行后,向右移动,确定另一个边界位置。(实现找到每组的边界位置,划分不同的箭头组)
2.定义一个布尔变量来确定打印的顺序;
3.定义一个打印每组数据的方法;

【代码实现】

//1.测试方法
public static void main(String[] args) {
		int[][] matrix = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
		printMatrixZigZag(matrix);

	}
	
//2.确定边界方法
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;
			dC = dR == endR ? dC + 1 : dC;//第二个位置往下,到达最后一行往右。
			dR = dR == endR ? dR : dR + 1;
			fromUp = !fromUp;//输出顺序也要改变
		}
		System.out.println();
	}

//3.按照指定顺序打印数据的方法
public static void printLevel(int[][] m, int tR, int tC, int dR, int dC,
			boolean f) {
		if (f) {
			while (tR != dR + 1) {
				System.out.print(m[tR++][tC--] + " ");//从上往下打印
			}
		} else {
			while (dR != tR - 1) {
				System.out.print(m[dR--][dC++] + " ");//从下往上打印
			}
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值