当前位置: 首页 > article >正文

数据结构基础之《(19)—矩阵处理》

一、zigzag打印矩阵

Z字形打印矩阵
 1  2  3  4  5  6
 7  8  9  10 11 12
 13 14 15 16 17 18
打印顺序:1,2,7,13,8,3,4,9,14...

核心技巧:找到coding上的宏观调度

左上角有A、B两个点,A往右一步一步走,B往下一步一步走
写一个函数从左下往右上打印,调度问题交给点A和B来移动

package class09;/*** Z字形打印矩阵*/
public class Code06_ZigZagPrintMatrix {public static void printMatrixZigZag(int[][] matrix) {int aR = 0; //A的行号int aC = 0; //A的列号int bR = 0; //B的行号int bC = 0; //B的列号int endR = matrix.length - 1; //最后的行号int endC = matrix[0].length - 1; //最后的列号boolean fromUp = false; //是不是从右上往左下打印while (aR != endR + 1) { //A的行号,不等于最后的行号+1,A到了终点printLevel(matrix, aR, aC, bR, bC, fromUp);aR = (aC == endC ? aR + 1 : aR); //A的列数到最后一列,A的行号才加1aC = (aC == endC ? aC : aC + 1); //A的列数到最后一列,A的列数不变,否则A的列数加1bC = (bR == endR ? bC + 1 : bC); //B的行数到最后一行,B的列数加1,否则B的列数不变bR = (bR == endR ? bR : bR + 1); //B的行数到最后一行,B的行数不变,否则B的行数加1fromUp = !fromUp; //打印方向}System.out.println();}/*** 告诉你斜线的两端是A和B,方向也告诉你,就可以打印了* @param m* @param tR* @param tC* @param dR* @param dC* @param f*/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},{13,14,15,16}};printMatrixZigZag(matrix);}
}

打印结果:

1 2 5 9 6 3 4 7 10 13 14 11 8 12 15 16 

二、转圈打印矩阵

按照层考虑:

第一层的结束的位置和第二层开始的位置挨着,第二层结束的位置和第三层开始的位置挨着。。。

思路:
获取四个角的点,打印时判断位置是否到四个角

package class09;/*** 回形打印矩阵*/
public class Code05_PrintMatrixSpiralOrder {public static void sprialOrderPrint(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--); //左上角点往右下方移动,右下角点往左上方移动}}/*** * @param m* @param tR 左上角点的行号* @param tC 左上角点的列号* @param dR 右下角点的行号* @param 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}};sprialOrderPrint(matrix);}
}

打印结果:

1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10 

三、原地旋转正方形矩阵

package class09;/*** 原地旋转正方形矩阵*/
public class Code04_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--);}}/*** 一个圈里面怎么转* @param m* @param a* @param b* @param c* @param 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++) {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);System.out.println("====================");rotate(matrix);printMatrix(matrix);}
}

打印结果:

1 2 3 4 
5 6 7 8 
9 10 11 12 
13 14 15 16 
====================
13 9 5 1 
14 10 6 2 
15 11 7 3 
16 12 8 4 

相关文章:

数据结构基础之《(19)—矩阵处理》

一、zigzag打印矩阵 Z字形打印矩阵 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 打印顺序&#xff1a;1,2,7,13,8,3,4,9,14... 核心技巧&#xff1a;找到coding上的宏观调度 左上角有A、B两个点&#xff0c;A往右一步一步走&#xff0c;B往下一步一步走 写一个…...

IDEA与Maven使用-学习记录(持续补充...)

1. 下载与安装 以ideaIU-2021.3.1为例&#xff0c;安装步骤&#xff1a; 以管理员身份启动ideaIU-2021.3.1修改安装路径为&#xff1a;D:\Program Files\JetBrains\IntelliJ IDEA 2021.3.1勾选【创建桌面快捷方式】&#xff08;可选&#xff09;、【打开文件夹作为项目】&…...

【运维笔记】docker 中 MySQL从5.7版本升级到8.0版本 - 平滑升级

在Docker环境中&#xff0c;将MySQL从5.7版本升级到8.0版本时&#xff0c;数据确实需要迁移。虽然不能直接通过docker-compose命令简单地进行版本升级并保留所有数据&#xff0c;但可以通过一系列步骤来实现平滑升级和数据迁移。以下是详细的迁移步骤&#xff1a; 一、准备阶段…...

nuxt2 打包优化使用“compression-webpack-plugin”插件

在使用 Nuxt.js 构建项目时&#xff0c;为了提高性能&#xff0c;通常会考虑对静态资源进行压缩。compression-webpack-plugin 是一个常用的 Webpack 插件&#xff0c;用于在生产环境中对文件进行 Gzip 压缩。这对于减少网络传输时间和提高页面加载速度非常有帮助。下面是如何在…...

fastapi+mysql实现增删改查

说明&#xff1a; 我计划用python的fastapi框架&#xff0c;实现操作MySQL数据库的表&#xff0c;实现增删改查的操作&#xff0c;并且在postman里面测试 step1: 安装数据库依赖 pip install fastapi uvicorn pymysqlstep2:C:\Users\Administrator\PycharmProjects\FastAPIPro…...

ArcGIS Pro:轻松制作地震动画,洞察灾害动态

在当今的信息展示领域&#xff0c;动画因其直观、生动的特点&#xff0c;逐渐成为各类汇报、研究展示中的重要元素。 尤其是在地理信息领域&#xff0c;通过动画来展示动态的地理现象&#xff0c;能够让观众更清晰地理解数据背后所蕴含的信息。 地震作为一种突发性的自然灾害…...

Redis系列之慢查询分析与调优

Redis 慢查询分析与优化&#xff1a;提升性能的实战指南 Redis 作为一款高性能的内存数据库&#xff0c;因其快速的数据读写能力和灵活的数据结构&#xff0c;被广泛应用于缓存、消息队列、排行榜等多种业务场景。然而&#xff0c;随着业务规模的扩大和数据量的增加&#xff0…...

Linux下磁盘读写流

用户空间请求 系统调用&#xff1a;应用程序通过系统调用&#xff08;如 read() 或 write()&#xff09;请求对文件或设备进行读写操作。 文件描述符&#xff1a;操作通过文件描述符进行&#xff0c;该描述符在应用程序打开文件时获得。 VFS&#xff08;虚拟文件系统&#xff…...

MAVEN手动配置(阿里云)全教程

介于网上各种各样的MAVEN配置过程中方法大致相同却细节参差不齐&#xff0c;我总结了我遇见的一些问题&#xff0c;来完全的解决MAVEN手动配置的全过程&#xff0c;以及分享解决小毛病的经验。 所需材料&#xff1a; MAVEN3.9.9&#xff08;下载适合自己的版本即可&#xff09…...

贪心算法一

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是贪心算法&#xff0c;并且掌握贪心算法。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! >…...

计算机毕业设计Python+DeepSeek-R1大模型微博的话题博文及用户画像分析系统 微博舆情可视化(源码+ 文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

Android Framework 常见面试题

以下是常见的 Android Framework 面试题&#xff0c;涵盖基础到高级知识点&#xff0c;帮助准备面试&#xff1a; 一、基础问题 Android 系统架构分层 描述 Android 系统的四层架构&#xff08;Linux Kernel、Native、Framework、Application&#xff09;及各层职责。 Zygote …...

绕过某书frida反调试检测 获取某宝支付参数

前言 在移动应用安全测试和研究过程中,我们经常需要使用Frida等工具对应用进行动态分析。然而,很多应用都实现了反调试和反注入机制,用来检测并阻止此类分析工具的使用。本文将分享如何使用Frida绕过某流行阅读应用(以下简称"某书",本次任务目的原本是需要找出…...

Secret Cow Code S

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言​📝 既然选择了远方,当不负青春,砥砺前行! 题目描述 奶牛们正在实验秘密代码,并设计了一种方法用于生成无限长度的字符…...

MyBatis - XML CRUD 其他查询

1. XML 配置文件 使用 MyBatis 操作数据库的方式有两种: 注解 (在注解中定义 SQL 语句)XML 配置文件 (在 XML 文件中定义 SQL 语句) 在上一篇博客中, 已经讲解了如何使用注解操作数据库, 本篇文章来讲解如何使用 XML 进行 MyBatis 开发. 使用 XML 的步骤, 和使用注解的步骤…...

牛客python蓝桥杯11-32(自用)

11 import os import sysdef huiwen(str):length len(str)# if length 0:# return -1result []for i in range(length-1): # 0 - length-2for j in range(i2,length1):# 取出从索引 i 到 j-1 的子串s str[i:j]# 正序倒序if s s[::-1]:result.append(len(s))if result…...

rabbitmq版本升级并部署高可用

RabbitMQ版本升级 先检查是否已经安装rabbitmq rpm -qa|grep rabbitmq|wc -l //如果结果是0&#xff0c;表示没有安装 rpm -e --nodeps $(rpm -qa|grep rabbitmq) //如安装了&#xff0c;则进行卸载 先检查是否已经安装erlang rpm -qa|grep erlang|wc -l //如果结果…...

Spring AI 1.0.0-M6 快速开始(一)

Spring AI 1.0.0-M6 入门一、存储库二、依赖管理完整maven 入门 Spring 是JAVA中我们经常使用的框架之一&#xff0c;Spring AI不断的发展迭代目前已经到M6版本据说上半年会出一个稳定版本。 本节提供了如何开始使用Spring AI的M6。 一、存储库 1.0 M6 -添加Spring存储库 需…...

数据集路径出错.yaml‘ images not found , missing path

方法一&#xff1a;删除settings.yaml 方法二&#xff1a;dataset_name.yaml改用绝对路径&#xff0c;如最后一张图 错误分析&#xff1a; dataset_name.yaml中的path的路径仅支持绝对路径&#xff0c;写相对路径就会搜索不到&#xff0c;使用settings.json中的路径&#xff0…...

win32汇编环境,对话框中使用树形视图示例二

;运行效果 ;win32汇编环境,对话框中使用树形视图示例二 ;得到树形视图控件Treeview的全路径字符串,这里的方法是由子项向父项挨个找的算法找齐路径 ;直接抄进RadAsm可编译运行。重要部分加备注。 ;下面为asm文件 ;>>>>>>>>>>>>>>&g…...

二维码(带背景图片或动态图)

原文链接&#xff1a;http://www.juzicode.com/archives/6377 桔子菌逛github的时候发现一个好玩的Python库&#xff0c;可以用来制作带背景图片或动态图的二维码&#xff0c;这个库在pypi上也有发布&#xff0c;可以直接通过pip安装&#xff1a; python -m pip install amzq…...

【连珠云弈】网页五子棋版项目测试报告

目录 一、项目背景 1.1、项目起源 1.2、市场需求 1.3、项目目标 二、项目功能 2.1 用户管理功能 2.2 游戏对战功能 三、测试报告 3.1.功能测试 ​编辑 3.1.1注册功能测试 解决bug&#xff1a; 测试总结&#xff1a; 3.1.2登录功能测试 测试总结&#xff1a; 3.…...

OpenCV计算摄影学(15)无缝克隆(Seamless Cloning)调整图像颜色的函数colorChange()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::colorChange 是 OpenCV 中用于调整图像颜色的函数。它允许你通过乘以不同的系数来独立地改变输入图像中红色、绿色和蓝色通道的强度&#xf…...

AI视频领域的DeepSeek—阿里万相2.1图生视频

让我们一同深入探索万相 2.1 &#xff0c;本文不仅介绍其文生图和文生视频的使用秘籍&#xff0c;还将手把手教你如何利用它实现图生视频。 如下为生成的视频效果&#xff08;我录制的GIF动图&#xff09; 如下为输入的图片 目录 1.阿里巴巴全面开源旗下视频生成模型万相2.1模…...

Unity中Stack<T>用法以及删除Stack<GameObject>的方法

Unity中Stack用法以及删除Stack的方法 介绍Stack<T>的APIStack<T> 常用方法创建和初始化 Stack<T>Push 和 Pop 操作Stack<T>遍历清空栈检查栈是否包含某个元素 栈的典型应用场景撤销操作深度优先搜索&#xff08;DFS&#xff09;注意事项 总结 介绍 因…...

用Python分割并高效处理PDF大文件

在处理大型PDF文件时&#xff0c;将它们分解成更小、更易于管理的块通常是有益的。这个过程称为分区&#xff0c;它可以提高处理效率&#xff0c;并使分析或操作文档变得更容易。在本文中&#xff0c;我们将讨论如何使用Python和为Unstructured.io库将PDF文件划分为更小的部分。…...

HarmonyOS Next~鸿蒙系统ArkCompiler跨平台编译技术的革新实践

HarmonyOS Next~鸿蒙系统ArkCompiler跨平台编译技术的革新实践 引言 在万物互联时代&#xff0c;操作系统对编译技术的需求已从单纯的代码转换演变为跨设备协同、高效资源调度与极致性能优化的综合挑战。华为鸿蒙系统&#xff08;HarmonyOS&#xff09;自主研发的ArkCompiler…...

RabbitMQ知识点

1.为什么需要消息队列&#xff1f; RabbitMQ体系结构 操作001&#xff1a;RabbitMQ安装 二、安装 # 拉取镜像 docker pull rabbitmq:3.13-management ​ # -d 参数&#xff1a;后台运行 Docker 容器 # --name 参数&#xff1a;设置容器名称 # -p 参数&#xff1a;映射端口号&…...

2025-03-06 学习记录--C/C++-PTA 习题6-6 使用函数输出一个整数的逆序数

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 二、代码&#xff08;C语言&#xff09;⭐️ #include <stdio.h>int reverse( int number );int main…...

力扣132. 分割回文串 II

力扣132. 分割回文串 II 题目 题目解析及思路 题目要求返回将s切割成若干回文串的最少切割次数 对于子串s[j...i]&#xff0c;若为回文串&#xff0c;则问题变为求s[0...j]的最少切割次数 因此可以考虑动态规划 对于问题s[j...i]是否为回文串&#xff0c;若s[i] s[j]则问…...