Codewars Detect Pangram问题排查:C#代码不符合预期求分析
问题排查与修复
代码存在的核心问题
- 非字母字符过滤不完整:你只过滤了ASCII码32到41的字符(空格、
!、"、#、$、%、&、'、(、)),但数字、逗号、句号等其他非字母字符都没被过滤,这些字符会被加入集合,导致集合元素数量不等于26,即使字符串是全字母句也会返回false。 - 判断逻辑不准确:直接通过
set.Count == 26判断,但如果集合中混入非字母字符,即使包含全部26个字母,Count也会大于26,导致错误返回false。 - 大小写处理逻辑和思路不一致:你的思路是转小写存入集合,但代码里把小写字母转成大写存入,虽然不影响字母唯一性,但逻辑不够统一,容易混淆。
修复后的代码
private static bool IsPangram(string str) { var letterSet = new HashSet<char>(); foreach (char ch in str) { // 只处理字母字符,忽略所有非字母内容 if (char.IsLetter(ch)) { // 统一转小写存入集合,消除大小写差异 letterSet.Add(char.ToLower(ch)); } } // 集合中仅包含字母,数量为26则说明覆盖全部英文字母 return letterSet.Count == 26; }
修复说明
- 用
char.IsLetter(ch)直接判断字母,一次性过滤所有非字母字符(数字、标点、符号等),比手动判断ASCII码更可靠易读。 - 统一转小写存入集合,完全匹配你最初的思路,避免大小写导致的重复存储问题。
- 最终判断集合元素数量时,集合内只会有字母,只要数量达标就说明覆盖了全部26个英文字母。
内容的提问来源于stack exchange,提问作者Mark Palik
相关产品推荐
相关产品推荐

