JavaScript mutation函数测试用例返回错误结果原因排查求助
问题分析与解决方案
你的代码出现问题主要有两个核心原因:大小写敏感的字符匹配和错误的计数逻辑,我们一步步拆解:
1. 大小写不匹配的问题
你的代码里直接比较原始字符的相等性,比如"Mary"里的'M'是大写,而"Army"里的'm'是小写,这两个字符在JavaScript中是不相等的('M' !== 'm')。所以当遍历"Army"里的'm'时,找不到匹配的字符,导致flag计数不足,最终返回false。
2. 重复字符的计数逻辑错误
对于["Mary", "Aarmy"]的情况,第二个字符串里有两个'a',但你的代码会尝试为每个'a'都在第一个字符串里找匹配并累加flag。而第一个字符串里只有一个'a',但你的需求是只要第一个字符串包含第二个字符串的所有种类的字母(不要求数量一致),这种计数方式会因为重复字符导致flag永远达不到b_arr.length,从而返回false。
修正后的代码
我们可以简化逻辑,同时解决上述两个问题:
function mutation(arr) { // 将两个字符串统一转为小写,消除大小写差异 const target = arr[0].toLowerCase(); const checkStr = arr[1].toLowerCase(); // 遍历需要检查的每个字符 for (const char of checkStr) { // 如果目标字符串不包含当前字符,直接返回false if (!target.includes(char)) { return false; } } // 所有字符都找到匹配,返回true return true; } console.log(mutation(["Mary", "Army"])); // true console.log(mutation(["Mary", "Aarmy"])); // true
为什么这个方案可行?
- 统一大小写:通过
toLowerCase()把两个字符串都转为小写,确保'M'和'm'被视为相同的字符。 - 更合理的检查逻辑:不再统计匹配次数,而是逐个检查第二个字符串的每个字符是否存在于第一个字符串中。只要有一个字符不存在就立即返回
false,全部存在则返回true,完美符合你期望的需求。
内容的提问来源于stack exchange,提问作者Vidhan Bagdai
相关产品推荐
相关产品推荐

