调试Javascript中使用Map实现的水果成篮问题代码错误
水果成篮问题代码错误定位与修复
核心错误点
- 存储逻辑错误:你定义的
fruitTypesMap中,value错误存储了遍历到当前位置的累计总长度++fruitCount,而非对应水果类型在当前窗口内的出现次数,导致后续删除旧水果类型时,扣减的水果数量完全不符合实际窗口情况。 - 窗口调整逻辑错误:你直接删除Map迭代的第一个key(Map按插入顺序返回的第一个类型),而非滑动窗口最左侧需要被移出的水果类型,完全不符合「最多包含2种不同元素的最长子数组」的滑动窗口调整规则。
- 最大值更新逻辑错误:你仅在添加新水果时更新最大值,窗口调整为合法状态后没有重新计算窗口长度更新最大值,会漏掉合法窗口的更大值。
修正后的参考代码
var totalFruit = function(fruits) { const fruitTypes = new Map(); let left = 0; let maxFruits = 0; for (let right = 0; right < fruits.length; right++) { // 统计当前右边界水果的出现次数 const currFruit = fruits[right]; fruitTypes.set(currFruit, (fruitTypes.get(currFruit) || 0) + 1); // 水果类型超过2种时移动左边界缩小窗口 while (fruitTypes.size > 2) { const leftFruit = fruits[left]; const leftCount = fruitTypes.get(leftFruit); if (leftCount === 1) { fruitTypes.delete(leftFruit); } else { fruitTypes.set(leftFruit, leftCount - 1); } left++; } // 此时窗口合法,更新最大值 maxFruits = Math.max(maxFruits, right - left + 1); } return maxFruits; };
验证说明
针对测试用例[3,3,3,1,2,1,1,2,3,3,4],修正后代码会正确识别到子数组[1,2,1,1,2]等合法窗口,最终返回正确结果5。
内容的提问来源于stack exchange,提问作者Rohit
相关产品推荐
相关产品推荐

