LeetCode反转元音字母挑战代码异常:索引匹配逻辑失效求修复
修复反转元音字母代码的触发逻辑问题
你的代码核心问题出在第二个循环的count自增逻辑:每次循环不管i是不是元音索引,count都会加1,导致markedItemsIndex[count]的索引和i完全错位,永远触发不了匹配判断。
举个例子,输入hello时,markedItemsIndex是[1,4],第二个循环i从0到4,count依次是0、1、2、3、4:
- i=0,count=0 → 0 vs 1 → 不匹配
- i=1,count=1 → 1 vs 4 → 不匹配
- i=2及之后,count≥2,
markedItemsIndex[count]是undefined,更不可能匹配i
修复方案
直接遍历元音索引数组,跳过不必要的全字符串遍历,同时补全大小写元音的处理(LeetCode题目通常包含大小写),还要记得最后将数组转为字符串返回:
var reverseVowels = function (s) { let newString = s.split(''); let markedItems = []; let markedItemsIndex = []; // 用Set存储所有元音(包含大小写),判断更高效 const vowels = new Set(['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']); // 收集元音字母和对应索引 for (let i = 0; i < newString.length; i++) { if (vowels.has(newString[i])) { markedItemsIndex.push(i); markedItems.push(newString[i]); } } // 反转元音数组 markedItems.reverse(); // 直接遍历索引数组,替换回原位置 for (let i = 0; i < markedItemsIndex.length; i++) { newString[markedItemsIndex[i]] = markedItems[i]; } return newString.join(''); // 必须转为字符串返回,原代码返回数组不符合要求 };
关键修复点说明
- 修正循环逻辑:不再遍历整个字符串,而是直接遍历元音索引数组,精准替换对应位置,彻底避免count错位问题
- 补全大小写处理:原代码只识别小写元音,添加大写元音后符合题目通用要求
- 移除无用标记:原代码中
newString[i] = 'marked'完全多余,直接替换原索引值即可 - 返回正确类型:LeetCode要求返回字符串,原代码返回数组,必须用
join('')转换
内容的提问来源于stack exchange,提问作者me-an-ape
相关产品推荐
相关产品推荐

