从 list-codewars 问题中查找单词的 Anagrams

Posted

技术标签:

【中文标题】从 list-codewars 问题中查找单词的 Anagrams【英文标题】:Finding the Anagrams of a word from a list- codewars question 【发布时间】:2021-03-05 18:46:10 【问题描述】:

我对编程很陌生,我正在解决一个代码大战问题,如下所示:

问题: 编写一个函数,从列表中找到一个单词的所有字谜。您将获得两个输入一个单词和一个带有单词的数组。如果没有,您应该返回所有字谜的数组或空数组。 这是我的代码

function anagrams(word, words) 
 let word_Array = word.split('').sort()
 let total = []
 for (x = 0; x<words.length; x++) 
    if(words[x].split('').sort() === word_Array) 
   total.push(words[x])
  return total 


结果应该是这样的 anagrams('abba', ['aabb', 'abcd', 'bbaa', 'dada']) =&gt; ['aabb', 'bbaa']

当我运行我的代码时,我不断得到一个空数组。请有人告诉我代码中的错误。谢谢

【问题讨论】:

您在循环内返回 total,因此,循环不会运行多次 - 如果循环运行时 if(words[x].split('').sort() === word_Array) 为 false,则 total 将是一个空数组 谢谢!你会建议我如何解决这个问题? 在for循环之外返回 【参考方案1】:

请看下面的sn-p。

const sort = (word) => word.split('').sort().join('');

function anagrams(word, words) 
  let token = sort(word);
  let total = []

  for (let x = 0; x < words.length; x++) 
    if (sort(words[x]) === token) 
      total.push(words[x])
        
  
  
  return total


console.log(anagrams('abba', ['aabb', 'abcd', 'bbaa', 'dada']));

您在正确的轨道上,但错过了一些细节。

    正如其他人所提到的,您不能只将离散数组与=== 进行比较。您能做的最好的事情就是进行元素明智的比较。如果您比较诸如numbersstringsbools 等正常值类型,您实际上并不需要这样做。如果您将排序后的字符串连接回来,则使用内置运算符(例如===)更容易进行比较。

    你的控制逻辑是错误的。注意你是如何直接从循环中返回的?这意味着您最多只能得到一个结果,因为循环不能迭代整个循环条件。

    您应该始终使用let/const 限定您的变量声明。这在 for 循环中缺失,并将 x 声明为全局变量。

改进

您可以用for of 替换for 循环,而不必担心索引。

for (let w of words) 
  console.log(w); // we no longer have to worry about words[i].

更好的是,您可以用简单的array.filter 替换整个forarray.push 逻辑

const sort = (word) => word.split('').sort().join('');

function anagrams(word, words) 
  let token = sort(word);
  
  return words.filter((w) => sort(w) === token);


console.log(anagrams('abba', ['aabb', 'abcd', 'bbaa', 'dada']));

【讨论】:

天哪,这太棒了!非常感谢你的解释,你真的很详细,我非常感谢。太感谢了!上帝保佑你!【参考方案2】:

Array 是 javascript 中的 Object,是引用类型。 所以不能用“===”来判断两个数组是否相等。

例如:

var array1=[1,2];
var array2=[1,2];

var result = array1 === array2;

结果将是错误的。

我的建议是编写一个新函数,通过比较项目来检查两个数组是否相等。

function areEquals(array1, array2)
   if(array1.length!==array2.length)
      return false;
   
   for(var i in array1)
      if(array1[i]!==array2[i])
         return false;
      
   
   return true;


【讨论】:

以上是关于从 list-codewars 问题中查找单词的 Anagrams的主要内容,如果未能解决你的问题,请参考以下文章

如何从单词列表中查找 DF 中的匹配单词并在新列中返回匹配的单词 [重复]

从 Excel 列表中“查找和替换”Word 中的多个单词

从输入字段中查找部分单词匹配,我还发现来自 HTML 代码的结果。为啥?

如果已知的搜索字符很少,如何从文件中单独查找一个单词

从 python 中的随机输入字母中查找单词。已经有啥算法可以使用/编码?

如何在R语言中查找具有连续字母的字符串中的单词