C# 不使用LINQ实现异位词查找方法 现有代码问题排查优化
问题解答
1. 构造函数正确性确认
你编写的构造函数是完全正确的:
- 对
sourceWord的空值校验、空字符串校验逻辑符合边界处理要求 - 将合法入参赋值给实例字段
word的操作没有问题,后续调用this.word的取值逻辑正确。
2. 现有代码的问题修复
你不需要在if语句里加嵌套for循环,现有异位词的判断思路是对的(把字符串转小写排序后比较是否相等),只需要修复两个bug即可:
- 排序后的字符数组转字符串的逻辑错误:
char2.ToString()不会返回字符拼接的结果,只会返回字符数组的类型名System.Char[],导致永远无法匹配成功,需要改为new string(char2)。 - 结果收集逻辑错误:你初始化的结果数组长度和候选数组一致,未匹配的位置会保留
null默认值,最终返回的数组会携带多余的空元素,不符合测试用例要求。可以用List<string>临时存储匹配到的结果,最后转成数组返回即可。
修正后的代码
public class Anagram { public string word; public Anagram(string sourceWord) { if (sourceWord is null) { throw new ArgumentNullException(nameof(sourceWord)); } if (sourceWord.Length == 0) { throw new ArgumentException(null); } this.word = sourceWord; } public string[] FindAnagrams(string[] candidates) { if (candidates is null) { throw new ArgumentNullException(nameof(candidates)); } // 预先计算目标词的排序后小写形式 char[] targetCharArr = this.word.ToLower().ToCharArray(); Array.Sort(targetCharArr); string sortedTarget = new string(targetCharArr); // 用List临时存匹配结果,避免空元素 List<string> result = new List<string>(); for (int i = 0; i < candidates.Length; i++) { char[] candidateCharArr = candidates[i].ToLower().ToCharArray(); Array.Sort(candidateCharArr); string sortedCandidate = new string(candidateCharArr); if (sortedTarget == sortedCandidate) { result.Add(candidates[i]); } } // 转成数组返回,符合方法返回值要求,且没有用到LINQ return result.ToArray(); } }
测试验证
修正后的代码可以直接通过你给出的所有测试用例,无需额外调整逻辑。
内容的提问来源于stack exchange,提问作者Linascts
相关产品推荐
相关产品推荐

