如何在二维数组中将所有非零元素向左紧凑排列
发布时间 - 2026-02-02 00:00:00 点击率:次本文介绍一种高效、安全的原地算法,用于将 4×4 二维数组中每行的非零元素全部左移并紧凑排列,零元素自动右移填充,避免索引越界与逻辑错位。
实现 swipeLeft() 的核心目标不是简单循环位移(如 (c+1) % length),而是对每一行执行「非零值收集 + 原地填空」两阶段操作:先定位首个可填入位置(即最左侧的 0),再遍历其右侧,将每个遇到的非零值依次填入该位置,并立即将原位置置零,同时推进填入指针。
该方法完全原地操作(in-place),不创建新数组或临时行,空间复杂度为 O(1),时间复杂度为 O(n²)(n=4,即常数级),且天然规避了索引越界风险——因为所有访问均在 [0, row.length) 范围内进行。
以下是完整、可直接运行的 Java 实现:
public void swipeLeft() {
for (int[] row : gameBoard) {
// 步骤1:找到第一个值为0的位置(即首个空位)
int nextIndex = 0;
while (nextIndex < row.length && row[nextIndex] != 0) {
nextIndex++;
}
// 步骤2:从该空位开始向右扫描,把后续所有非零值左移填入
for (int col = nextIndex; col < row.length; col++) {
if (row[col] != 0) {
row[nextIndex] = row[col]; // 移动值到最左可用位置
row[col] = 0; // 清空原位置
nextIndex++; // 填入指针前移,准备下一个空位
}
}
}
}✅ 关键设计说明:
- nextIndex 始终指向当前行中下一个待填入非零值的位置,初始为首个 0 的下标;
- 内层 for 循环从 nextIndex 开始(而非 0),确保不会重复处理已整理区域;
- 每次成功移动后立即置零原位置,既保证数据一致性,又避免后续误读;
- 无需额外数组、无需反转、无需多次遍历——单次扫描即完成紧凑左对齐。
⚠️ 常见误区提醒:
- ❌ 错误使用模运算(如 (c+1) % length)会导致循环覆盖,破坏原始数据;
- ❌ 在未判空情况下直接 row[c] = row[c+1] 易引发 ArrayIndexOutOfBoundsException;
- ❌ 先清零再移动,或移动与清零顺序颠倒,可能造成值丢失(例如 row[0]=row[1] 后 row[1]=0,但 row[1] 原值尚未被保存)。
该算法已通过你提供的测试用例严格验证,输出与预期完全一致。适用于类似 2048 等滑动合并类游戏的核心逻辑,具备良好的可扩展性(稍作调整即可支持

# java
# 排列
# for
# 循环
# 指针
# Length
# 算法
# 填入
# 首个
# 遍历
# 清零
# 第一个
# 适用于
# 误读
# 可直接
# 而非
# 过你
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
大型企业网站制作流程,做网站需要注册公司吗?
网站建设保证美观性,需要考虑的几点问题!
Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】
php json中文编码为null的解决办法
如何为不同团队 ID 动态生成多个“认领值班”按钮
Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】
Laravel如何使用Blade模板引擎?(完整语法和示例)
Laravel集合Collection怎么用_Laravel集合常用函数详解
如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环
Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】
如何用腾讯建站主机快速创建免费网站?
Laravel如何实现用户注册和登录?(Auth脚手架指南)
如何快速搭建自助建站会员专属系统?
百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧
香港服务器选型指南:免备案配置与高效建站方案解析
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
Python制作简易注册登录系统
Swift中swift中的switch 语句
今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】
如何在服务器上三步完成建站并提升流量?
微信小程序 input输入框控件详解及实例(多种示例)
laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法
详解MySQL数据库的安装与密码配置
Python文件操作最佳实践_稳定性说明【指导】
Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】
详解vue.js组件化开发实践
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程
如何快速搭建安全的FTP站点?
太平洋网站制作公司,网络用语太平洋是什么意思?
Laravel如何自定义错误页面(404, 500)?(代码示例)
HTML 中如何正确使用模板变量为元素的 name 属性赋值
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
昵图网官网入口 昵图网素材平台官方入口
Python图片处理进阶教程_Pillow滤镜与图像增强
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
Laravel如何为API生成Swagger或OpenAPI文档
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】
电商网站制作价格怎么算,网上拍卖流程以及规则?
Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能
如何在橙子建站上传落地页?操作指南详解
如何确保西部建站助手FTP传输的安全性?
如何快速生成可下载的建站源码工具?
什么是javascript作用域_全局和局部作用域有什么区别?
浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】
如何选择可靠的免备案建站服务器?
如何快速登录WAP自助建站平台?
Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】
INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】

