赣州做网站的大公司新闻事件
赣州做网站的大公司,新闻事件,公司做公司网站宣传,海南营销网站建设本系列可作为JAVA学习系列的笔记#xff0c;文中提到的一些练习的代码#xff0c;小编会将代码复制下来#xff0c;大家复制下来就可以练习了#xff0c;方便大家学习。 点赞关注不迷路#xff01;您的点赞、关注和收藏是对小编最大的支持和鼓励#xff01; 系列文章目录…本系列可作为JAVA学习系列的笔记文中提到的一些练习的代码小编会将代码复制下来大家复制下来就可以练习了方便大家学习。点赞关注不迷路您的点赞、关注和收藏是对小编最大的支持和鼓励系列文章目录JAVA初阶---------已更完JAVA数据结构 DAY1-集合和时空复杂度JAVA数据结构 DAY2-包装类和泛型JAVA数据结构 DAY3-List接口JAVA数据结构 DAY4-ArrayListJAVA数据结构 DAY5-LinkedList拓展目录手把手教你用 ArrayList 实现杨辉三角从逻辑推导到每行代码详解目录目录系列文章目录拓展目录目录前言一、杨辉三角的核心规律代码逻辑的基础二、整体实现思路拆解2.1 数据存储结构2.2 核心流程三、逐行代码推导与详解3.1 完整实现代码3.2 逐行代码详解按执行流程3.2.1 导入包与类定义3.2.2 核心方法generate定义3.2.3 外层容器初始化3.2.4 边界处理3.2.5 初始化第一行3.2.6 迭代生成后续行核心循环3.2.7 主方法测试四、代码执行流程演示以生成 3 行为例五、关键技术点与注意事项5.1 为什么选择 ArrayList 而不是 LinkedList5.2 常见错误与避坑指南5.3 扩展功能建议六、总结总结前言小编作为新晋码农一枚会定期整理一些写的比较好的代码作为自己的学习笔记会试着做一下批注和补充如转载或者参考他人文献会标明出处非商用如有侵权会删改欢迎大家斧正和讨论杨辉三角是经典的数学与编程结合案例其 “每行首尾为 1、中间元素等于上一行左右两元素之和” 的规律恰好能发挥 ArrayList 动态数组的优势 —— 支持随机访问快速获取上一行元素和动态扩容适配每行长度递增的特点。本文将从杨辉三角的规律分析入手逐行推导代码的形成逻辑不仅教你实现功能更让你理解 “为什么要这么写”适合 Java 初学者巩固 ArrayList 用法和逻辑思维能力。一、杨辉三角的核心规律代码逻辑的基础在写代码前必须先明确杨辉三角的数学规律这是所有代码的出发点第 1 行只有 1 个元素[1]从第 2 行开始每行元素个数 行号第 2 行 2 个元素第 3 行 3 个元素…第 n 行 n 个元素每行的第 1 个元素和最后 1 个元素都是 1每行的中间元素第 j 个j 从 1 到行号 - 20 开始计数 上一行第 j-1 个元素 上一行第 j 个元素。示例前 5 行杨辉三角plaintext第0行索引0[1] 第1行索引1[1, 1] 第2行索引2[1, 2, 1] → 中间元素2 上一行[1] 上一行[1] 第3行索引3[1, 3, 3, 1] → 中间元素3上一行[1]上一行[2]3上一行[2]上一行[1] 第4行索引4[1, 4, 6, 4, 1] → 413633431二、整体实现思路拆解要用车 ArrayList 实现杨辉三角需先确定数据存储结构和核心流程2.1 数据存储结构外层容器用ArrayListListInteger存储整个杨辉三角。因为每行都是一个整数列表且整个三角的行数是动态的由用户指定ArrayList 的动态扩容特性刚好适配。内层容器用ArrayListInteger存储每行数据。每行元素个数随行数递增ArrayList 能自动扩容无需手动管理容量。2.2 核心流程边界处理如果用户指定的行数≤0返回空集合避免无效运算初始化第一行直接添加[1]到外层容器第一行是固定值无需计算迭代生成后续行从第 2 行到第 n 行a. 获取上一行数据用于计算当前行中间元素b. 创建当前行的 ArrayList先添加第一个元素 1c. 计算中间元素循环遍历利用上一行的两个元素求和d. 添加当前行最后一个元素 1e. 将当前行添加到外层容器遍历打印结果优化显示效果使三角居中。三、逐行代码推导与详解下面结合完整代码逐行分析 “为什么要这么写”从逻辑到代码一步步拆解3.1 完整实现代码import java.util.ArrayList; import java.util.List; public class YangHuiTriangleWithArrayList { // 方法生成n行杨辉三角返回外层ArrayList public static ListListInteger generate(int numRows) { // 1. 外层容器存储整个杨辉三角 ListListInteger yangHui new ArrayList(); // 2. 边界处理行数≤0时返回空集合 if (numRows 0) { return yangHui; } // 3. 初始化第一行只有元素1 ListInteger firstRow new ArrayList(); firstRow.add(1); yangHui.add(firstRow); // 4. 迭代生成第2行到第numRows行i从1开始对应第2行 for (int i 1; i numRows; i) { // 4.1 获取上一行数据当前行i的上一行是i-1 ListInteger prevRow yangHui.get(i - 1); // 4.2 创建当前行容器 ListInteger currRow new ArrayList(); // 4.3 当前行第一个元素固定为1 currRow.add(1); // 4.4 计算中间元素从索引1到索引i-1因为最后一个元素是1单独添加 for (int j 1; j i; j) { // 上一行第j-1个元素 上一行第j个元素 int left prevRow.get(j - 1); int right prevRow.get(j); currRow.add(left right); } // 4.5 当前行最后一个元素固定为1 currRow.add(1); // 4.6 将当前行添加到外层容器 yangHui.add(currRow); } // 5. 返回生成的杨辉三角 return yangHui; } // 主方法测试生成并打印杨辉三角 public static void main(String[] args) { // 指定生成10行杨辉三角可修改行数 int rows 10; ListListInteger result generate(rows); // 遍历打印添加前置空格使三角居中优化显示效果 for (ListInteger row : result) { // 前置空格数量 总行数 - 当前行元素个数使三角居中 for (int i 0; i rows - row.size(); i) { System.out.print( ); } // 打印当前行每个元素用空格分隔 for (int num : row) { System.out.print(num ); } // 每行结束后换行 System.out.println(); } } }3.2 逐行代码详解按执行流程3.2.1 导入包与类定义import java.util.ArrayList; import java.util.List;为什么要写ArrayList 和 List 都是 Java 集合框架的类 / 接口位于java.util包下必须导入才能使用否则编译器会报错。public class YangHuiTriangleWithArrayList {为什么要写Java 是面向对象语言所有代码必须放在类中。类名遵循 “大驼峰命名法”与文件名保持一致这是 Java 的语法规范避免编译错误。3.2.2 核心方法generate定义public static ListListInteger generate(int numRows) {方法修饰符public staticpublic表示该方法可被外部调用static表示无需创建类对象直接通过类名调用方便主方法测试返回值ListListInteger外层是 List内层每个元素也是 ListInteger对应 “整个三角 - 每行数据” 的存储结构参数int numRows接收用户指定的杨辉三角行数是生成逻辑的输入条件。3.2.3 外层容器初始化ListListInteger yangHui new ArrayList();为什么用ListListInteger声明遵循 “面向接口编程” 原则List 是接口ArrayList 是实现类声明为 List 更灵活后续可替换为其他实现类如 LinkedList无需修改其他代码为什么初始化new ArrayList()必须创建具体的实现类对象否则yangHui是 null无法添加元素。菱形运算符是 Java 7 的特性无需重复写泛型类型简化代码。3.2.4 边界处理if (numRows 0) { return yangHui; }为什么要写如果用户传入numRows0或负数生成杨辉三角无意义直接返回空集合避免后续无效的循环和内存占用提升代码健壮性。3.2.5 初始化第一行ListInteger firstRow new ArrayList(); firstRow.add(1); yangHui.add(firstRow);第一行是固定值[1]无需计算直接创建内层 ArrayList 并添加元素 1为什么要添加到外层容器yangHui后续生成第 2 行及以后时需要从上一行即外层容器中的前一个元素获取数据所以必须将第一行存入外层容器。3.2.6 迭代生成后续行核心循环for (int i 1; i numRows; i) {循环变量i表示当前行的索引从 1 开始因为第 0 行已初始化循环条件i numRows表示生成到第numRows-1行共numRows行为什么从i1开始第 0 行第一行已手动添加后续需要生成第 1 行到第numRows-1行对应实际的第 2 行到第numRows行。ListInteger prevRow yangHui.get(i - 1);作用获取上一行的数据用于计算当前行的中间元素为什么用yangHui.get(i-1)外层容器yangHui的索引与行索引一致当前行是i上一行就是i-1ArrayList 的get(int index)方法支持随机访问时间复杂度 O (1)能快速获取上一行数据这是 ArrayList 比 LinkedList 适合该场景的关键。ListInteger currRow new ArrayList();作用创建当前行的容器用于存储当前行的所有元素为什么每次循环都要新建每行数据是独立的不能复用之前的容器否则会导致数据覆盖。currRow.add(1);依据杨辉三角规律每行第一个元素固定为 1直接添加到当前行容器。for (int j 1; j i; j) {循环变量j表示当前行中间元素的索引从 1 开始因为索引 0 已添加 1循环条件j i当前行有i1个元素因为行索引i从 1 开始第 1 行有 2 个元素第 2 行有 3 个元素…中间元素的索引范围是1 ~ i-1例如第 2 行i2中间元素索引j1循环 1 次第 3 行i3中间元素索引j1、2循环 2 次。int left prevRow.get(j - 1); int right prevRow.get(j); currRow.add(left right);核心逻辑中间元素 上一行第j-1个元素 上一行第j个元素示例第 2 行i2j1leftprevRow.get(0)1rightprevRow.get(1)1求和得 2添加到当前行即[1,2]为什么用prevRow.get()上一行是ListInteger类型必须通过get(index)获取指定位置元素ArrayList 的随机访问特性保证了该操作高效。currRow.add(1);依据杨辉三角规律每行最后一个元素固定为 1添加后当前行完整例如第 2 行变为[1,2,1]。yangHui.add(currRow);作用将当前行添加到外层容器完成一行的生成为下一行计算提供 “上一行数据”。3.2.7 主方法测试public static void main(String[] args) {主方法是 Java 程序的入口必须声明为public static void main(String[] args)否则 JVM 无法启动程序。int rows 10; ListListInteger result generate(rows);rows10指定生成 10 行杨辉三角可修改为任意正整数如 5、8 等调用generate(rows)生成杨辉三角返回结果存入result变量。for (ListInteger row : result) {增强 for 循环foreach遍历外层容器result每次取出一行数据ListInteger row比普通 for 循环更简洁无需手动获取索引。for (int i 0; i rows - row.size(); i) { System.out.print( ); }作用添加前置空格使杨辉三角居中显示优化用户体验空格数量计算总行数 - 当前行元素个数例如总行数 10第 0 行元素个数 1空格数 9第 1 行元素个数 2空格数 8… 最终形成居中效果为什么用System.out.print( )print不换行println换行这里需要连续打印空格所以用print。for (int num : row) { System.out.print(num ); }遍历当前行的每个元素用空格分隔打印例如第 2 行打印 “1 2 1”。System.out.println();一行打印完成后换行进入下一行的打印。四、代码执行流程演示以生成 3 行为例为了更直观理解以numRows3为例演示代码执行过程外层容器yangHui初始化[]边界处理30不返回初始化第一行firstRow[1]yangHui[[1]]循环生成后续行i1和i2i1第 2 行prevRowyangHui.get(0)[1]currRow初始化添加 1 →[1]中间元素循环j1 1不成立循环不执行添加最后一个 1 →currRow[1,1]yangHui.add(currRow)→yangHui[[1], [1,1]]i2第 3 行prevRowyangHui.get(1)[1,1]currRow初始化添加 1 →[1]中间元素循环j1 2成立leftprevRow.get(0)1rightprevRow.get(1)1求和 2 →currRow[1,2]添加最后一个 1 →currRow[1,2,1]yangHui.add(currRow)→yangHui[[1], [1,1], [1,2,1]]打印结果第 0 行空格数 3-12 → “1”第 1 行空格数 3-21 → “1 1”第 2 行空格数 3-30 → “1 2 1”最终输出1 1 1 1 2 1五、关键技术点与注意事项5.1 为什么选择 ArrayList 而不是 LinkedList随机访问需求生成中间元素时需要频繁通过索引获取上一行的元素prevRow.get(j-1)和prevRow.get(j)ArrayList 的get方法是 O (1)LinkedList 是 O (n)效率天差地别动态扩容适配每行元素个数递增ArrayList 自动扩容无需手动管理容量而 LinkedList 的节点开销更大每个节点需存储 prev/next 引用。5.2 常见错误与避坑指南循环条件错误中间元素循环j i写成j i→ 导致索引越界上一行没有ji的元素忘记初始化第一行直接进入循环生成i1的行prevRowyangHui.get(0)会报IndexOutOfBoundsException没有边界处理传入numRows0时返回的yangHui是空集合打印时无输出合理但如果不处理后续循环也不会执行不会报错只是逻辑不完整打印时没有居中直接打印会导致三角靠左影响可读性添加前置空格是优化体验的关键。5.3 扩展功能建议生成指定行的杨辉三角而非前 n 行例如只生成第 5 行[1,4,6,4,1]可优化代码无需存储整个三角只需保留上一行数据减少空间开销限制元素显示格式例如每个元素占固定宽度如System.out.printf(%3d, num)使三角更整齐支持更大行数当行数较多时如 100 行居中空格可调整为(rows - row.size()) * 2避免元素重叠。六、总结本文通过 “规律分析→思路拆解→逐行推导→流程演示” 的步骤详细讲解了用 ArrayList 实现杨辉三角的完整过程。核心是利用 ArrayList 的两个优势随机访问高效快速获取上一行元素支撑中间元素计算动态扩容适配每行元素个数递增的特点。代码的每一行都有其逻辑依据从数据结构选择到循环条件设计再到边界处理和显示优化都是围绕杨辉三角的规律和 ArrayList 的特性展开。希望通过本文你不仅能掌握杨辉三角的实现更能理解 “为什么这么写”从而提升逻辑思维和代码编写能力。总结以上就是今天要讲的内容本文简单记录了java数据结构仅作为一份简单的笔记使用大家根据注释理解您的点赞关注收藏就是对小编最大的鼓励