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

JavaScript编写wiggleMaxLength函数出现无限循环问题

问题:wiggleMaxLength 函数运行陷入无限循环

实现摆动序列最大长度计算的JavaScript代码运行时无法正常终止,始终卡在执行状态,问题代码如下:

var wiggleMaxLength = function(nums) {
  let wiggleSteps = 1;
  let actualDiff, pastDiff, i;
  for (i = 1; i < nums.length; i++) {
    actualDiff = (nums[i] - nums[i - 1])
    if (nums[i] = 0) {
      nums.splice(i, 1);
      i--;
      continue;
    } else if ((pastDiff > 0 && actualDiff < 0)  || (pastDiff < 0 && actualDiff > 0) || (i = 1)) {
      pastDiff = actualDiff;
      wiggleSteps++;
    } else {
      break;
    }
  }
  return wiggleSteps;
};
问题根因

代码里有两处把**赋值运算符=**写在了条件判断位置,直接导致死循环,同时存在逻辑设计错误:

  • 第一处条件写为if (nums[i] = 0):单等号是赋值操作,不是相等判断,执行时会直接把当前索引的元素值改为0,且表达式返回值为0(falsy值),永远不会进入这个分支。
  • 第二处条件末尾写为(i = 1):同样是赋值操作,只要走到else if判断,就会把循环变量i强制重置为1,赋值表达式返回1(truthy值),会让else if条件始终成立。for循环每次执行完循环体做i++后i变成2,下一轮判断又被重置为1,永远达不到i >= nums.length的循环终止条件,直接陷入无限循环。
  • 附带逻辑错误:本来要过滤的是相邻元素差值为0的平坡情况,代码错写成判断元素本身是否为0,且没有给pastDiff设置初始值,第一次循环时pastDiff为undefined,和数值比较的结果全为false。
修复后代码
var wiggleMaxLength = function(nums) {
  if (nums.length < 2) return nums.length;
  let wiggleSteps = 1;
  let pastDiff = 0;
  for (let i = 1; i < nums.length; i++) {
    const actualDiff = nums[i] - nums[i-1];
    // 差值为0直接跳过,不需要修改原数组
    if (actualDiff === 0) continue;
    // 差值正负交替或者是第一个有效差值时计数
    if ((actualDiff > 0 && pastDiff <=0) || (actualDiff <0 && pastDiff >=0)) {
      wiggleSteps++;
      pastDiff = actualDiff;
    }
  }
  return wiggleSteps;
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:03:13