矩阵打印问题

news2025/7/22 18:22:28

文章目录

  • 1、题目一:正方形矩阵顺时针转动90度
    • 1.1 题目描述
    • 1.2 思路分析
    • 1.3 代码实现
  • 2、题目二:转圈打印长方形矩阵
    • 2.1 题目描述
    • 2.2 思路分析
    • 2.3 代码实现
  • 3、题目三:zigzag打印矩阵
    • 3.1 题目描述
    • 3.2 思路分析
    • 3.3 代码实现
  • 4、题目四:输出初始边长为 N 的图案
    • 4.1 题目描述
    • 4.2 思路分析
    • 4.3 代码实现

1、题目一:正方形矩阵顺时针转动90度

1.1 题目描述

给定一个正方形矩阵 matrix原地 调整成顺时针90度转动的样子
正方形矩阵原地旋转90度

1.2 思路分析

题目解读,就是矩阵根据中心点,每个位置顺时针旋转90度,即如图:
请添加图片描述
注意,题目要求的是在不申请辅助数组的情况下,原地调整。

题目给定的一定是正方形,因为所使用的内存地址是不会变的。

本题涉及到一个重要的知识点——矩阵的分圈结构

矩阵的左上角和右下角坐标可以确定矩阵的一圈,而这一圈中的数旋转依然还是在这一圈中。一圈中的数旋转完成后,将左上角和右下角坐标均往里层变化,直到两个坐标发生了错位就表示旋转完成。

请添加图片描述
那么一圈中的数怎么调整呢?使用分组。

请添加图片描述
如果整个矩阵的左上角坐标是 ( a , b ) (a, b) (a,b),右下角坐标是 ( c , d ) (c, d) (c,d),那么第 i i i 组的第一个的坐标是 ( a , b + i ) (a, b+i) (a,b+i),第二个的坐标是 ( a + i , d ) (a+i, d) (a+i,d), 第三个的坐标是 ( c , d − i ) (c, d-i) (c,di),第四个坐标是 ( c − i , b ) (c-i, b) (ci,b)

启发:矩阵的分圈结构。

1.3 代码实现

public class RotateMatrix {

	public static void rotate(int[][] matrix) {
		int a = 0;
		int b = 0;
		int c = matrix.length - 1;
		int d = matrix[0].length - 1;
		while (a < c) {
			rotateEdge(matrix, a++, b++, c--, d--); //圈中调整,调整完成后左上角和右下角坐标往中间变化
		}
	}

	public static void rotateEdge(int[][] m, int a, int b, int c, int d) {
		int tmp = 0;
		//圈中的每组的四个位置互相变换
		for (int i = 0; i < d - b; i++) { //d-b就是组号,表示一共有多少组
			tmp = m[a][b + i];
			m[a][b + i] = m[c - i][b];
			m[c - i][b] = m[c][d - i];
			m[c][d - i] = m[a + i][d];
			m[a + i][d] = tmp;
		}
	}

	public static void printMatrix(int[][] matrix) {
		for (int i = 0; i != matrix.length; i++) {
			for (int j = 0; j != matrix[0].length; j++) {
				System.out.print(matrix[i][j] + " ");
			}
			System.out.println();
		}
	}

	public static void main(String[] args) {
		int[][] matrix = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 }, { 13, 14, 15, 16 } };
		printMatrix(matrix);
		rotate(matrix);
		System.out.println("=========");
		printMatrix(matrix);

	}
}

2、题目二:转圈打印长方形矩阵

2.1 题目描述

给定一个长方形矩阵matrix,实现转圈打印

a  b  c  d
e  f  g  h
i  j  k  L

打印顺序:a b c d h L k j i e f g

2.2 思路分析

依然是分圈

请添加图片描述

2.3 代码实现

先列举具体的数据量然后再抽象化。

public class PrintMatrixSpiralOrder {

	public static void spiralOrderPrint(int[][] matrix) {
		int tR = 0;
		int tC = 0;
		int dR = matrix.length - 1;
		int dC = matrix[0].length - 1;
		while (tR <= dR && tC <= dC) {
			printEdge(matrix, tR++, tC++, dR--, dC--);
		}
	}

	public static void printEdge(int[][] m, int tR, int tC, int dR, int dC) {
		if (tR == dR) {
			for (int i = tC; i <= dC; i++) {
				System.out.print(m[tR][i] + " ");
			}
		} else if (tC == dC) {
			for (int i = tR; i <= dR; i++) {
				System.out.print(m[i][tC] + " ");
			}
		} else {
			int curC = tC;
			int curR = tR;
			while (curC != dC) {
				System.out.print(m[tR][curC] + " ");
				curC++;
			}
			while (curR != dR) {
				System.out.print(m[curR][dC] + " ");
				curR++;
			}
			while (curC != tC) {
				System.out.print(m[dR][curC] + " ");
				curC--;
			}
			while (curR != tR) {
				System.out.print(m[curR][tC] + " ");
				curR--;
			}
		}
	}

	public static void main(String[] args) {
		int[][] matrix = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 },
				{ 13, 14, 15, 16 } };
		spiralOrderPrint(matrix);

	}
}

3、题目三:zigzag打印矩阵

3.1 题目描述

给定一个正方形或者长方形矩阵 matrix,实现zigzag打印

0 1 2
3 4 5
6 7 8 

打印: 0 1 3 6 4 2 5 7 8

3.2 思路分析

在这里插入图片描述
跳出局部,看宏观。

两个点A和B,一开始这两个点都是指的矩阵左上角的点,规定 A 一直往右走,不能再往右的时候往下;而规定B一直往下走,不能再往下的时候往右走。A每走一步,B也要相应地走一步,二者连线是条斜线,将这条斜线打印出来即可。

在这里插入图片描述
再写一个斜线打印的方程,其中包含从下往上打印和从上向下打印,使用布尔值区分打印方向。

3.3 代码实现

public class ZigZagPrintMatrix {

	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();
	}
	
	//打印斜线
	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++] + " "); //从下往上方向
			}
		}
	}

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

	}
}

4、题目四:输出初始边长为 N 的图案

4.1 题目描述

给定一个 n ∗ n n*n nn 的矩阵,在其中按照如下规则填 *

例1: n = 3 n=3 n=3
在这里插入图片描述
例2: n = 4 n=4 n=4
在这里插入图片描述
例3: n = 5 n=5 n=5
在这里插入图片描述
例4: n = 10 n=10 n=10
在这里插入图片描述

4.2 思路分析

也就是无论往哪个方向填,每个方向都要留个空格避免与之前的 * 碰到。

依然是分圈,但是是两层一个圈,当前这个圈打印完后,左上角往右下角跳两层、右下角往左上角跳两层来到第二个圈。搞定每圈的打印,整个图案就可以打印完成。
在这里插入图片描述

4.3 代码实现

public class PrintStar {

	public static void printStar(int N) {
		int leftUp = 0;
		int rightDown = N - 1;
		char[][] m = new char[N][N];
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				m[i][j] = ' ';
			}
		}
		while (leftUp <= rightDown) {
			set(m, leftUp, rightDown);
			leftUp += 2;
			rightDown -= 2;
		}
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				System.out.print(m[i][j] + " ");
			}
			System.out.println();
		}
	}

	public static void set(char[][] m, int leftUp, int rightDown) {
		for (int col = leftUp; col <= rightDown; col++) {
			m[leftUp][col] = '*';
		}
		for (int row = leftUp + 1; row <= rightDown; row++) {
			m[row][rightDown] = '*';
		}
		for (int col = rightDown - 1; col > leftUp; col--) {
			m[rightDown][col] = '*';
		}
		for (int row = rightDown - 1; row > leftUp + 1; row--) {
			m[row][leftUp + 1] = '*';
		}
	}

	public static void main(String[] args) {
		printStar(5);
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/395028.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NFS服务器与CGI程序详解

目录 NFS 服务器 一&#xff0c;NFS 服务器简介 二&#xff0c;NFS的使用 三&#xff0c;客户端使用 autofs 自动挂载 1&#xff0c;autofs产生的原因 四&#xff0c;autofs的安装与配置文件 五&#xff0c;autofs的使用 www服务器---cgi程序 CGI程序的应用 NFS 服务器 一&a…

React(六):Redux的使用、react-redux简化代码、redux模块化、RTK的使用

React&#xff08;六&#xff09;一、Redux测试项目搭建1.创建store仓库2.创建reducer函数&#xff08;纯函数&#xff09;3.constants.js保存action名字4.修改store中的数据5.动态生成action二、React中如何使用redux1.安装redux2.创建store3.组件中订阅store4.派发action修改…

运行Hive

Hive的定义&#xff1a;基于Hadoop的数据仓库解决方案将结构化的数据文件映射为数据库表提供类sql的查询语言HQL (Hive Query Language)Hive让更多的人使用hadoopHive的运行机制Hive 通过给用户提供的一系列交互接口&#xff0c;接收到用户的指令(SQL)&#xff0c;使用自己的 D…

LinkedIn最好的辅助工具

领英精灵都有什么功能领英精灵是我国技术人员花巨资针对领英平台研发的辅助工具。具有好友分组、备注&#xff0c;一键批量加好友&#xff0c;批量撤回邀请&#xff0c;批量群发消息&#xff0c;批量导出好友资料&#xff0c;批量点赞六大功能。通过领英精灵可大大提高领英开发…

自建服务器系列- DDNS配置

1、环境说明 光猫桥接路由器拔号的模式 2、DDNS是什么 对于DHCP方式获得的IP&#xff0c;无论对于局域网内来说&#xff0c;还是外网来说&#xff0c;都会有使得IP地址每隔一段时间变化一次&#xff0c;如果想要通过恒定不变的地址访问主机&#xff0c;就需要动态域名解析。…

凝聚共识,锚定未来 | 第四届OpenI/O 启智开发者大会NLP大模型论坛成功举办!

2023年2月24日下午&#xff0c;第四届OpenI/O启智开发者大会NLP大模型分论坛在深圳人才研修院隆重举办。该论坛以“开源集智创新探索中文NLP大模型生态发展”为主题&#xff0c;众多业内人士和研发者在此共享NLP领域的前沿动态和研发经验&#xff0c;畅想中国NLP领域的发展前景…

RocketMQ 5.0 学习笔记

1. 需求 背景&#xff1a;业务需要&#xff0c;平台将使用rocketMQ来实现消息的发送与消费&#xff0c;替代redis的消息功能。 需要在搭建好rocketMQ平台后&#xff0c;进行研究和验证。 技术&#xff1a;Springboot RocketMQ5.0 使用场景&#xff1a;签到活动&#xff0c…

DBCO intermidate 3,二苯并环辛炔-四乙酰甘露糖胺一种生化小分子糖标记

DBCO-四乙酰甘露糖胺 &#xff0c;二苯并环辛炔-四乙酰甘露糖胺 | 纯度&#xff1a;95% | DBCO intermidate 31.试剂信息&#xff1a;CAS&#xff1a;N/A外观&#xff1a;固体/粉末分子量&#xff1a;C33H34N2O11分子式&#xff1a;634.64溶解性&#xff1a;溶于有机溶剂&#…

Unity项目优化方案2023

每年整个新活&#xff0c;每年出个手游项目。又到了项目收尾的季节&#xff0c;也是最掉头发的时候。这两周开启漫漫的优化之路。老方法&#xff0c;先按住Ctrl7&#xff0c;打开profiler性能分析工具&#xff0c;找到性能占用的大头。不用看也能猜到&#xff0c;Batches是优化…

JavaEE简单示例——MyBatis的二级缓存机制

简单介绍&#xff1a; 在之前&#xff0c;我们介绍了关于MyBatis的一级缓存机制&#xff0c;之前我们说过&#xff0c;一级缓存是基于SqlSession的对同一条SQL语句多次查询的时候&#xff0c;会将第一次查询的结果缓存到内存中&#xff0c;之后的所有的相同的查询会直接从内存…

修改redis改key值不改过期时间

今天在做图片验证码的时候遇到一个问题。用redis的生命周期来存放&#xff0c;用户输入错误次数。 三十秒内输错三次就&#xff0c;等待三十分钟。 那么问题来了&#xff0c;如果说第一次输入错误&#xff0c;应该是 key为用户用&#xff0c;value 为 次数2 ex就为30秒 &…

[数据结构]:13-插入排序(顺序表指针实现形式)(C语言实现)

目录 前言 已完成内容 插入排序实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-PSeqListFunction.cpp 04-SortCommon.cpp 05-SortFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容&#xff0c;除其中使用到C引用外&#xff0c;全为C语言代…

M2E2: Cross-media Structured Common Space for Multimedia Event Extraction 论文解读

Cross-media Structured Common Space for Multimedia Event Extraction 论文&#xff1a;multimediaspace2020.pdf (illinois.edu) 代码&#xff1a;limanling/m2e2: Cross-media Structured Common Space for Multimedia Event Extraction (ACL2020) (github.com) 期刊/会议…

【3D点云】目标检测总结(持续汇总)

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目…

Java Spring 中 Resources 路径若干问题

ant-style资源路径通配符 ANT通配符有三种&#xff1a; 最长匹配规则&#xff08;has more characters&#xff09;&#xff0c;即越精确的模式越会被优先匹配到。例如&#xff0c;URL请求/app/dir/file.jsp&#xff0c;现在存在两个路径匹配模式/**/*.jsp 和 /app/dir/*.js…

C++回顾(九)——多继承

9.1 多继承 9.1.1 概念 一个类有多个直接基类的继承关系称为多继承&#xff08;多个父类&#xff09;多继承声明语法 class 派生类名 : 访问控制 基类名1 , 访问控制 基类名2 , … , 访问控制 基类名n {数据成员和成员函数声明 }&#xff1b;类 C 可以根据访问控制同时…

Git在某个节点切出新分支

操作前&#xff0c;必须先备份分支&#xff0c;避免丢失代码&#xff01;&#xff01;&#xff01;&#xff01; 操作前&#xff0c;必须先备份分支&#xff0c;避免丢失代码&#xff01;&#xff01;&#xff01;&#xff01; 操作前&#xff0c;必须先备份分支&#xff0c;避…

Mr. Cappuccino的第46杯咖啡——Maven多模块项目可插拔式打包部署方案

Maven多模块项目可插拔式打包部署方案需求调研前准备项目结构模块之间的依赖关系项目pom文件项目代码代码运行效果方案调研需要实现的效果解决方案代码实现打包运行效果完整打包测试插拔式打包测试最佳实践项目结构测试运行效果完整打包测试插拔式打包测试需求 早期的【train-h…

吐血整理,自动化测试pytest测试框架,资深测试带你少走弯路......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 Pytest框架详解 py…

ledcode----丢失的数字

目录 题目截图&#xff1a; 题目接口&#xff1a; 第一种解法&#xff1a; 思路&#xff1a; 第二种解法&#xff1a;差值法 思路&#xff1a; 第三种解法&#xff1a;位运算异或法 关于异或操作符的预备知识&#xff1a; 思路&#xff1a; 例子&#xff1a;输入数组[0…