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
相关产品推荐
相关产品推荐

