0

0

Java 双重循环控制打印螺旋矩阵的思路与代码

冰川箭仙

冰川箭仙

发布时间:2026-03-17 10:14:03

|

952人浏览过

|

来源于php中文网

原创

螺旋矩阵填充需用while循环配合上下左右四边界,按顶行→右列→底行→左列顺序填数,每段填完立即收缩对应边界(top++/right--/bottom--/left++),避免重复覆盖。

java 双重循环控制打印螺旋矩阵的思路与代码

怎么用双重循环控制边界来填螺旋矩阵

Java 里没有现成的螺旋矩阵生成函数,得靠手动维护上下左右四个边界,用两层 for 循环模拟顺时针绕圈过程。核心不是“画”,而是“填”——把 1n*n 按顺序塞进二维数组对应位置。

关键在每次填完一行或一列后,立刻收缩对应边界:比如从左到右填完顶行,就把 top 下移;从上到下填完右列,就把 right 左移。不收缩就会重复覆盖或越界。

  • 必须用 while (left 控制大循环,不能写成 <code>for (int i = 0; i —— 因为每轮填的是不等长的边,轮数不等于 <code>n
  • 四段填充顺序固定:左→右、上→下、右→左、下→上,缺一不可;漏掉任一段,5x5 这种奇数阶矩阵中间那个数就填不上
  • 每段填完都要检查边界是否仍有效,比如填完右列后,top 可能已 > bottom,此时必须跳出,否则下一段会越界

为什么 ij 的起止值总容易错

不是记不住加减,而是没分清「当前边长度」和「数组索引范围」。比如填顶行:for (int j = left; j ,这里 <code>j 是列索引,起始是 left(当前最左列),终点是 right(当前最右列),不是 0n-1

常见错误是写成 for (int j = 0; j ,结果所有轮次都往第 0 行狂塞,或者填完第一圈后第二圈还从 <code>0 开始,直接覆盖前面数据。

立即学习Java免费学习笔记(深入)”;

  • 所有循环变量都必须基于当前边界:填右列用 for (int i = top; i ,不是 <code>i = 0
  • 填底行和左列时,注意方向是反的:for (int j = right; j >= left; j--),少写 = 就会漏掉一个数
  • 如果用 ++i 写成 i++ 不影响逻辑,但别在条件里混用,比如 j++ 是错的

ArrayIndexOutOfBoundsException 最常在哪几处爆发

90% 的越界发生在四段填充的衔接点:当矩阵阶数为偶数(如 4x4)时,填完第二圈后 top > bottomleft > right,但后续循环没及时退出,继续执行第三段(比如右→左)就会用无效的 i 去访问 matrix[i][j]

另一个高发点是把 错写成 <code>,尤其在填左列(<code>for (int i = bottom; i >= top; i--))时,漏掉 i == top 那个位置,导致最后一行少一个数,下一轮边界计算错位,最终崩在下一次访问。

  • 每次修改边界后,立刻在下一段循环前加 if (top > bottom || left > right) break;,比依赖 while 条件更保险
  • 不要省略循环体内的花括号,哪怕只有一行:缺少 {} 容易让 break 或边界更新语句失效
  • 调试时打印每轮的 top/bottom/left/right 值,一眼能看出哪轮开始异常

小矩阵(1x12x2)为什么老出怪结果

1x1 时,四段填充里只有第一段(左→右)能执行,其余三段的循环条件直接失败;但如果你在填完第一段后没收缩 top,第二段(上→下)的 i 范围就是 topbottom,而此时 top == bottom,它真会跑一次——然后你就在 [0][0] 上写了两次 1

2x2 更典型:填完顶行([0][0][0][1]),top 变成 1;填右列([1][1]),right 变成 0;这时 left == right == 0,但 top == bottom == 1,底行循环 for (int j = right; j >= left; j--) 会填 [1][0],没问题;可紧接着左列循环 for (int i = bottom; i >= top; i--)i 从 1 到 1,又去填 [1][0] —— 重复了。

  • 每段填完必须立即更新对应边界:top++right--bottom--left++
  • 更新顺序要和填充顺序严格一致:填完顶行 → top++;填完右列 → right--;填完底行 → bottom--;填完左列 → left++
  • int[][] matrix = new int[n][n]; 初始化即可,别用 null 或不等长数组,否则 matrix[i].length 会干扰判断

边界收缩的时机和顺序,比循环嵌套本身更关键。写完一段就立刻动对应边界,别攒着一起改;每改一次,就想想下一段的循环条件还成不成立——这个习惯比背代码管用。

相关文章

全能打印神器
全能打印神器

全能打印神器是一款非常好用的打印软件,可以在电脑、手机、平板电脑等设备上使用。支持无线打印和云打印,操作非常简单,使用起来也非常方便,有需要的小伙伴快来保存下载体验吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

255

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1153

2024.03.01

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

107

2023.09.25

java中break的作用
java中break的作用

本专题整合了java中break的用法教程,阅读专题下面的文章了解更多详细内容。

120

2025.10.15

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

262

2025.10.24

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1071

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

618

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

335

2025.08.29

Nginx跨平台安装实操指南:Windows、macOS与Linux环境快速搭建
Nginx跨平台安装实操指南:Windows、macOS与Linux环境快速搭建

本指南详解Nginx在Windows、macOS及Linux系统的安装全流程。涵盖官方包解压、Homebrew一键部署、APT/YUM源配置及Docker容器化方案。无论新手或开发者,均可快速搭建运行环境,掌握跨平台核心指令,为后续配置与调优奠定坚实基础。

10

2026.03.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.5万人学习

C# 教程
C# 教程

共94课时 | 11.5万人学习

Java 教程
Java 教程

共578课时 | 83.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号