马鞍山网站建设公flash中文网站模板

张小明 2026/1/12 4:34:54
马鞍山网站建设公,flash中文网站模板,灰色词快速上排名,网站名和域名【LeetCode 踩坑日记】No.189 轮转数组#xff1a;被 ArrayList 的初始化骗了#xff1f; 在刷算法题的过程中#xff0c;我们经常会遇到一种情况#xff1a;思路明明是正确的#xff0c;逻辑也很通顺#xff0c;但代码一跑就崩#xff0c;或者结果不对。 今天我在做 Le…【LeetCode 踩坑日记】No.189 轮转数组被 ArrayList 的初始化骗了在刷算法题的过程中我们经常会遇到一种情况思路明明是正确的逻辑也很通顺但代码一跑就崩或者结果不对。今天我在做LeetCode 189. 轮转数组时就遭遇了一个经典的 Java 集合陷阱。这篇博客将记录我从“理直气壮”到“恍然大悟”的排错过程并总结关于数组轮转的通用解法。1. 题目回顾题目给定一个整数数组nums将数组中的元素向右轮转k个位置。示例输入:nums [1,2,3,4,5,6,7], k 3输出:[5,6,7,1,2,3,4]2. 我的“完美”思路与报错代码我的第一反应非常直观创建一个新的列表list。遍历原数组计算每个元素移动k步后的新位置。如果位置超出了数组长度就绕回到开头否则直接放入新位置。使用ArrayList的set方法填值。于是我写出了以下代码// ❌ 错误示范classSolution{publicvoidrotate(int[]nums,intk){// 我以为这里创建了一个长度为 nums.length 的列表ListIntegerlist1newArrayList(nums.length);for(inti0;inums.length;i){// 这里逻辑其实有点硬编码把 k 当成了 3if(i3nums.length-1){list1.set(i3-nums.length,nums[i]);}else{list1.set(i3,nums[i]);}}System.out.println(list1);}}运行结果直接抛出java.lang.IndexOutOfBoundsException: Index 2 out of bounds for length 0。3. 深度解析为什么会报错看到报错我非常困惑我在new ArrayList(nums.length)时不是已经指定长度了吗为什么报错说length 0这里触及到了 JavaArrayList的一个核心机制Capacity容量 vs Size元素个数。Capacity容量是你告诉底层数组“请预留多少空间”。Size实际大小是列表里实际上装了多少个有效元素。当我们执行new ArrayList(10)时Java 只是在内存里开辟了一个能放10个东西的“空架子”但是架子上还没有书此时size依然是 0。add()方法是在列表尾部追加元素会使size 1。set(index, element)方法是修改现有位置的元素。它会检查index是否小于size。因为我的列表是空的Size 0任何set(index, val)操作都会被判定为越界因为那个位置上根本还没有元素可以被“修改”。修正思路如果想用“指定位置填值”的逻辑应该直接使用数组 (int[])因为数组在创建时new int[n]所有位置默认已经初始化为 0长度是固定的可以直接通过下标赋值。4. 逻辑上的二次修正除了报错我的代码逻辑还有两个问题需要解决才能通过 LeetCode 的测试A. 变量k的处理我之前的代码里写死了i 3这是针对示例 1 的特解。题目中的k是变量且k可能大于数组长度。改进使用取模运算符%。newIndex (i k) % n这行公式完美解决了越界和绕回的问题不需要写if-else判断。B. 引用修改 vs 打印题目方法的返回类型是void。这意味着仅仅System.out.println是没用的LeetCode 的判题系统会检查内存中nums数组的内容是否发生了变化。改进必须把计算出的新结果重新拷贝回原数组nums。5. 最终正确代码辅助数组法经过思考我放弃了ArrayList改用辅助数组代码变得清晰且高效// ✅ 正确解答classSolution{publicvoidrotate(int[]nums,intk){intnnums.length;// 1. 创建一个同样长度的新数组int[]newArrnewint[n];// 2. 计算新位置并赋值for(inti0;in;i){// 使用 (i k) % n 处理循环移动newArr[(ik)%n]nums[i];}// 3. 将新数组的值拷贝回原数组// System.arraycopy(newArr, 0, nums, 0, n); // 也可以用这个APIfor(inti0;in;i){nums[i]newArr[i];}}}6. 进阶思考能不能不费额外空间上面的解法使用了O(N)的额外空间创建了newArr。如果面试官问“能不能在O(1)空间复杂度下完成即不使用额外数组”这需要用到**“三次翻转法”**非常巧妙翻转整个数组。翻转前k % n个元素。翻转剩余的元素。示例[1,2,3,4,5,6,7],k3全翻转[7,6,5,4,3,2,1]翻转前3个[5,6,7, 4,3,2,1]翻转后4个[5,6,7, 1,2,3,4]-成功7. 总结这次排错让我学到了三点API 误区new ArrayList(capacity)只是申请内存不代表 List 里有元素。想按索引操作优先选数组或者先填充 List。数学之美处理循环数组索引时%取模运算比if-else判断更优雅通用。审题重要性注意函数的返回类型和副作用要求是返回新对象还是原地修改。编程就是这样一个不断犯错、理解底层、然后优化的过程。希望能帮到遇到同样报错的你
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

app与网站的区别功能南昌网站建设方案优化

鸣潮智能助手终极指南:从新手到专家的完整使用教程 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸上锁合成 自动肉鸽 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves 鸣潮智能助…

张小明 2026/1/11 14:13:57 网站建设

杭州公司建设网站合肥网页制作

MySQL 运算符 MySQL 是一种广泛使用的开源关系型数据库管理系统,它提供了丰富的运算符来处理数据。运算符是数据库查询语言(SQL)的核心组成部分,用于在查询中执行各种计算和比较操作。本文将详细介绍 MySQL 中常用的运算符,包括算术运算符、比较运算符、逻辑运算符等。 …

张小明 2026/1/12 6:42:52 网站建设

网站备案号 查询网站开发的公司推荐

12月4日下午,“2025企业家博鳌论坛-数字金融安全发展大会暨数字金融联合宣传年年度活动”在海南博鳌举行,大会由新华网主办,中金金融认证中心有限公司(CFCA)携手金融机构、科技企业及业界力量参加本次大会。大会上&…

张小明 2026/1/11 14:48:43 网站建设

成品网站源码的优化技巧万网网站备案系统

Linux网络安全与系统安装全攻略 1. Linux网络安全基础 在网络环境中,保障Linux服务器的安全至关重要,因为大多数恶意攻击往往源自网络,尤其是互联网。下面将介绍一些保障Linux服务器网络安全的基础方法。 1.1 网络服务管理 确定并移除不必要的网络服务可以简化网络服务的…

张小明 2026/1/11 21:35:34 网站建设

怎样网站优化公司上海大学生兼职做网站

如何5分钟完成飞书文档批量导出:企业知识库迁移的终极解决方案 【免费下载链接】feishu-doc-export 项目地址: https://gitcode.com/gh_mirrors/fe/feishu-doc-export 当企业需要将飞书知识库迁移到本地时,手动下载数百份文档不仅效率低下&#…

张小明 2026/1/10 8:15:39 网站建设

网站在阿里云备案流程wordpress 我爱搜罗网

WPF导航组件现代化界面快速上手指南 【免费下载链接】wpfui WPF UI在您熟悉和喜爱的WPF框架中提供了流畅的体验。直观的设计、主题、导航和新的沉浸式控件。所有这些都是本地化且毫不费力的。 项目地址: https://gitcode.com/GitHub_Trending/wp/wpfui 你是否曾经为WPF应…

张小明 2026/1/9 21:53:12 网站建设