【问题标题】:Trouble solving this coding puzzle using JavaScript无法使用 JavaScript 解决这个编码难题
【发布时间】:2017-02-28 10:13:00
【问题描述】:

说明如下:

“编写一个函数,该函数将从列表中找到一个单词的所有字谜。您将得到两个输入,一个单词和一个带有单词的数组。您应该返回一个包含所有字谜的数组,如果有则返回一个空数组没有。例如:

anagrams('abba', ['aabb', 'abcd', 'bbaa', 'dada']) => ['aabb', 'bbaa']"

我找到了一个 sn-p,它采用第一个参数并提供所有可能的字符组合。我现在的麻烦是弄清楚如何将此数组与第二个参数匹配,并返回一些结果..

function allAnagrams (word,words) {
  

  if (word.length < 2) {
    return [word];
  } else {
      var allAnswers = [];
      
      
      for (var i = 0; i < word.length; i++) {
        var letter = word[i];
        var shorterWord = word.substr(0, i) + word.substr(i + 1, word.length - 1);
        var shortwordArray = allAnagrams(shorterWord);
        for (var j = 0; j < shortwordArray.length; j++) {
          allAnswers.push(letter + shortwordArray[j]);
          
        }
        
      }
      
      return allAnswers;
  }
  
}



allAnagrams("abc",["acb","cba","bac","bca"]);

我的直觉是将单词拆分成一个数组,然后再嵌套一个 for 循环来匹配需要匹配的内容。但是,我似乎在处理范围时遇到了一些问题并不断破坏功能,所以我求助于你们这些聪明的人。如果您有时间,我将不胜感激如何从这里解决这个问题。

【问题讨论】:

    标签: javascript arrays algorithm scope closures


    【解决方案1】:

    您基本上需要查看您的第一个字符串的任何permutation 是否出现在数组中。

    比较两个字符串是否相互排列的一种快速方法是对两个字符串进行排序并进行比较:

    function stringSort(string) {
      return string.split('').sort().join('');
    }
    
    function isAnagram(first, second) {
      // are the two sorted strings equal, if so then anagram
      return stringSort(first) == stringSort(second);
    }
    

    现在,我们可以使用这些方便的函数来帮助我们构建最终所需的函数:

    function allAnagrams(word, words) {
      return words.filter(function(element) {
        return isAnagram(word, element);
      });
    }
    

    注意Array#filter 的使用,这是一种非常方便的方法,可以在某些条件下将数组简化为几个值。

    请注意,我没有对此进行测试,如果有任何问题,请询问。

    【讨论】:

    • 很好。可以通过预先计算stringSort(word)进行优化。
    • @Amadan 我在创建这个时意识到我使用了“快速”这个词,而根本没有尝试优化 xD
    • 这很酷,很高兴知道。如果您不介意解释参数“元素”的确切来源是什么?并且会像 Amadan 所说的那样预先计算只是在 allAnagrams 函数中添加一个行拆分/排序“单词”吗?
    • 您可以查看我在 @Benediah 的帖子中提供的所有链接,例如,请参阅此处 Array#filter 以获取有关 element 的帮助
    • @Benediah 你也很乐意实施和试验我的代码,例如尝试添加console.log(element)
    猜你喜欢
    • 2012-02-29
    • 2011-01-09
    • 2011-05-06
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多