You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode移动零题JavaScript解法中j++索引递增逻辑疑问

关于移动零题解中j后缀自增逻辑的说明

你担心的非零元素放置错误的情况不会出现,j++是后缀自增运算符,规则是先取变量当前值参与运算,再对变量执行自增操作,刚好匹配这段双指针代码的设计逻辑。

双指针的作用定义

这段代码用了两个指针分工:

  • i 是遍历指针:负责从头到尾扫描整个数组的所有元素
  • j 是存储指针:永远指向「下一个非零元素应该放置的位置」

逐步骤运行演示(以输入[0,1,0,3,12]为例)

初始状态:nums = [0,1,0,3,12],j = 0

  1. i=0:nums[i]为0,不满足判断条件,直接跳过
  2. i=1:nums[i]为1≠0,进入逻辑
    • 先暂存非零值n = 1
    • 将当前i位置设为0,nums变为[0,0,0,3,12]
    • 执行nums[j++] = n:先取j的当前值0,把nums[0]赋值为1,再将j自增为1
    • 此时nums变为[1,0,0,3,12],非零值1放在了正确的首位
  3. i=2:nums[i]为0,直接跳过
  4. i=3:nums[i]为3≠0,进入逻辑
    • 暂存非零值n = 3
    • 将当前i位置设为0,nums变为[1,0,0,0,12]
    • 执行nums[j++] = n:先取j的当前值1,把nums[1]赋值为3,再将j自增为2
    • 此时nums变为[1,3,0,0,12],非零值3按顺序放在了1的后面
  5. i=4:nums[i]为12≠0,进入逻辑
    • 暂存非零值n = 12
    • 将当前i位置设为0,nums变为[1,3,0,0,0]
    • 执行nums[j++] = n:先取j的当前值2,把nums[2]赋值为12,再将j自增为3
    • 最终nums为[1,3,12,0,0],完全符合题目要求

补充说明

如果这里换成前缀自增++j才会出现你担心的错位问题:第一次执行时j初始为0,前缀自增会先把j改为1,再把1赋值到nums[1],最终结果会变成[0,1,3,12,0],不符合要求。
另外这段代码的巧思是每次取出非零值后直接把i位置设为0,不需要遍历结束后再单独给j到数组末尾的位置统一填0,一步完成操作。

内容的提问来源于stack exchange,提问作者Jaimie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 08:54:07