【问题标题】:Finding the Anagrams of a word from a list- codewars question从 list-codewars 问题中查找单词的 Anagrams
【发布时间】: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循环之外返回

标签: javascript string algorithm anagram


【解决方案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']));

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

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

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

  3. 您应该始终使用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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 2020-06-07
    • 2012-10-01
    • 2018-10-04
    • 2012-01-06
    • 2020-09-03
    • 2017-01-19
    相关资源
    最近更新 更多