数组连续相同值检测及JavaScript代码逻辑错误修复求助
问题解决:数组连续重复元素检测与重排错误修复
核心问题分析
原函数的第一个for循环逻辑完全颠倒:
- 当前逻辑:只要发现任意一对相邻元素不相等,就直接返回"There are no identical consecutive values",终止检测。这导致只要数组里存在不相邻的元素,就直接判定没有连续重复,完全违背了“遍历全数组,检查是否存在至少一组连续重复元素”的需求。
- 第二个
for循环存在边界问题:当i遍历到数组最后一个元素时,arr[i+1]为undefined,会错误地将最后一个元素判定为不重复并推入栈中,但实际上此时没有下一个元素可用于比较。
修正后的代码
function noIdenticalConsecutives(arr) { let stack = new Stack(); let repeat = []; if (arr.length === 0) return "No values to iterate"; // 修正:遍历全数组检测是否存在连续重复元素 let hasConsecutiveDuplicates = false; for (let i = 0; i < arr.length - 1; i++) { if (arr[i] === arr[i + 1]) { hasConsecutiveDuplicates = true; break; // 只要发现一组就可以停止检测,提升效率 } } // 如果没有连续重复,直接返回提示 if (!hasConsecutiveDuplicates) { return "There are no identical consecutive values"; } // 修正:正确收集重复元素与非重复元素,处理边界问题 for (let i = 0; i < arr.length; i++) { // 只在不是最后一个元素且与下一个元素相等时,收集重复项 if (i < arr.length - 1 && arr[i] === arr[i + 1]) { repeat.push(arr[i]); } else { stack.push(arr[i]); } } // 将重复元素插入栈的合适位置,避免再次出现相邻重复 // 遍历栈寻找可以插入的位置,确保插入后无相邻相同元素 for (const element of repeat) { let inserted = false; for (let j = 0; j < stack.length; j++) { if (j === 0 && stack[j] !== element) { stack.insert(j, element); inserted = true; break; } else if (j > 0 && stack[j-1] !== element && stack[j] !== element) { stack.insert(j, element); inserted = true; break; } } // 如果所有位置都相邻重复,就放到末尾(兜底处理) if (!inserted) { stack.push(element); } } return stack; } // 测试调用 console.log(noIdenticalConsecutives([14, 4, 10, 7, 3, 1, 1, 5, 7, 7]));
关键改动说明
连续重复检测逻辑修正:
- 新增
hasConsecutiveDuplicates标记,遍历数组时只要发现一组连续相等元素就标记为true,并可提前终止遍历。 - 遍历完成后,根据标记决定是否进入后续处理流程,而非中途错误返回。
- 新增
边界问题修复:
- 在收集重复元素时,增加
i < arr.length - 1的判断,避免访问数组越界的undefined值。
- 在收集重复元素时,增加
重复元素重排优化:
- 原代码只是将重复元素堆到栈末尾,可能导致新的相邻重复(比如栈末尾元素和重复元素相同)。修正后改为遍历栈,寻找不与前后元素重复的位置插入,确保最终数组无相邻相同元素。
内容的提问来源于stack exchange,提问作者ArgentumCoder
相关产品推荐
相关产品推荐

