我与计算机对手创建了一个拼字游戏。如果在生成单词期间在计算机机架中找到空白磁贴,则需要换掉字母表中的每个字母。我现在有解决这个问题的解决方案,但是想知道是否有更好的方法来完成这个任务。
if (str.Contains("*"))
{
char c = 'A';
String made = "";
while(c < 'Z')
{
made = str.ReplaceFirst("*", c.ToString());
if (!made.Contains("*"))
{
wordsMade.Add(made);
if (theGame.theTrie.Search(made) == Trie.SearchResults.Found)
{
validWords.Add(made);
}
}
else
{
char ch = 'A';
String made2 = "";
while (ch < 'Z')
{
made2 = made.ReplaceFirst("*", c.ToString());
wordsMade.Add(made2);
if (theGame.theTrie.Search(made2) == Trie.SearchResults.Found)
{
validWords.Add(made2);
}
ch++;
}
}
c++;
}
答案 0 :(得分:2)
Adam是正确的,可以重构代码以使其更小(实际上更小),但从根本上说,您必须检查所有26 * 26个通配符组合。因此,虽然可以使代码在语法上更有效率,但我认为你不能使它在算法上更有效率。
答案 1 :(得分:1)
这里有很多重复的代码可以重构。
这个例程是重复的,可以放在一个单独的方法中:
wordsMade.Add(made2);
if (theGame.theTrie.Search(made2) == Trie.SearchResults.Found)
{
validWords.Add(made2);
}
这样的事情
void addWord(string newWordMade){
wordsMade.Add(newWordMade);
if (theGame.theTrie.Search(newWordMade) == Trie.SearchResults.Found)
{
validWords.Add(newWordMade);
}
}
此循环结构也是重复的:
char ch = 'A';
String made2 = "";
while (ch < 'Z')
{
made2 = made.ReplaceFirst("*", c.ToString());
wordsMade.Add(made2);
if (theGame.theTrie.Search(made2) == Trie.SearchResults.Found)
{
validWords.Add(made2);
}
ch++;
}
将前一个重构与这个重构与一个光滑的lambda结合起来会得到这样的结果:
void loopCharactersAndDoThis(Action<char> DoThis) {
char ch = 'A';
while (ch < 'Z')
{
DoThis(ch);
ch++;
}
}
else
{
loopCharactersAndDoThis(ch => {
string made2 = made.ReplaceFirst("*", c.ToString());
addWord(made2);
});
}
甚至只是:
else
{
loopCharactersAndDoThis(ch => addWord(made.ReplaceFirst("*", c.ToString())));
}