从 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']) => ['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']));
您在正确的轨道上,但错过了一些细节。
正如其他人所提到的,您不能只将离散数组与===
进行比较。您能做的最好的事情就是进行元素明智的比较。如果您比较诸如numbers
、strings
、bools
等正常值类型,您实际上并不需要这样做。如果您将排序后的字符串连接回来,则使用内置运算符(例如===
)更容易进行比较。
你的控制逻辑是错误的。注意你是如何直接从循环中返回的?这意味着您最多只能得到一个结果,因为循环不能迭代整个循环条件。
您应该始终使用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 替换整个for
和array.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 中的匹配单词并在新列中返回匹配的单词 [重复]
从输入字段中查找部分单词匹配,我还发现来自 HTML 代码的结果。为啥?