排查Java代码缺陷:统计含至少一个元音和辅音的字符串子段数量
代码缺陷分析
你的代码的核心分割逻辑(找到最短的同时包含元音和辅音的子段后计数、重置计数器继续向后遍历)是符合题目示例要求的,无法通过全量用例主要存在以下几类遗漏场景:
- 未处理大小写元音:代码仅判断了小写的
a/e/i/o/u,若输入包含大写元音字母(如A、E等),会被错误识别为辅音,导致结果错误。例如输入Ab时,你的代码返回0,正确结果应为1。 - 未处理非字母字符:如果题目定义中辅音仅指代英文字母里的辅音字母,那么数字、特殊符号等非字母字符既不属于元音也不属于辅音,你的代码会将这类字符错误判定为辅音,导致计数错误。例如输入
a1时,你的代码返回1,若规则要求非字母不计入则正确结果应为0。 - 边界情况兼容问题:如果题目允许包含其他语言的元音字符(比如带重音的字母)也会导致判定错误,不过常规算法题一般默认仅考虑26个英文字母。
修复方案参考
如果题目明确输入仅包含小写英文字母,那仅需要调整元音判定逻辑即可;如果需要兼容大小写和非字母场景,可以参考如下修改:
public static int segments(String password){ int numberSegments = 0; int vowel = 0; int consonant = 0; // 统一转小写处理,也可以在判断时同时匹配大小写 String lowerPwd = password.toLowerCase(); for(int index = 0; index < lowerPwd.length(); index++){ char c = lowerPwd.charAt(index); // 先判断是否是字母,不需要可以删除该判断 if(!Character.isLetter(c)){ continue; } if(c == 'a' || c == 'e' || c == 'i' || c == 'u' || c == 'o'){ vowel++; } else { consonant++; } if(vowel >= 1 && consonant >= 1){ numberSegments++; vowel = 0; consonant = 0; } } return numberSegments; }
你可以根据题目的实际输入范围调整判定规则,比如题目明确输入仅为小写字母,去掉转小写和非字母判断的逻辑即可。
内容的提问来源于stack exchange,提问作者trilocho
相关产品推荐
相关产品推荐

