Javascript Sock Merchant 挑战 - 解决方案 1
请先阅读:正如评论和推特帖子中所述,第一部分中的解决方案未必是最佳方案。第二部分将分享第二个解决方案,该方案通常针对此类挑战进行了优化。
简要前言
说实话,我一点也不喜欢算法代码挑战。这话出自一个制作算法题解题教程,并且还致力于“改进 JavaScript 面试流程”的人之口,或许会让人觉得不可思议。但现实是,如果你想成为一名 JavaScript 开发人员,在目前的面试环境下,几乎不可能绕过这类挑战。
HackerRank 是一个绝佳的平台,让你能够轻松入门并提升算法编写技能。“袜子商人”挑战就是其中一项趣味十足的挑战。如果你从未接触过这类问题,它可能会让你感到有些畏惧,但我可以保证,你每天都在潜意识里解决着远比这复杂得多的问题。
挑战
约翰在一家服装店工作。他有一大堆袜子需要按颜色配对出售。给定一个整数数组,每个整数代表一只袜子的颜色,请确定有多少双颜色相同的袜子。
代码
function sortAndCount( n, arr ) {
let sorted = arr.sort( (a,b) => a - b);
let pairs = 0;
for (let i = 0; i < n - 1; i++) {
if ( sorted[i] === sorted[i + 1]) {
pairs++;
i += 1;
}
}
return pairs;
}
视频文字稿
解决袜子商人挑战的一种方法是先对数组进行排序,然后逐个比较每个元素以找出配对的袜子,最后统计找到的袜子对的数量。
第一步,我们将创建一个变量来保存排序后的数组,并使用内置的 sort 方法。sort 方法可以接受一个比较函数作为参数。传入的比较函数将确保元素按升序排列。
接下来,我们创建一个名为 pairs 的变量来保存最终计数,默认值为 0。
此时,如果我们传入袜子数组,sorted 函数的预期输出应该是这样的。
接下来,我们设置一个 for 循环。
我们自然是从索引 0 开始,但由于我们要并排比较项目,所以在最后一个索引处结束循环。
现在我们可以将数组中的每个元素与其直接对应的元素进行比较,以
找到一对元素。
如果找到匹配项,则将该对的值加一。同时,
由于我们已经检查过下一个项目,因此我们将 i 加一以跳过它。
如果这两个项目不匹配,则正常的循环将继续进行。
现在我们已经对结果进行了排序和并排比较,让我们运行我们的解决方案。
这是一个不错的初步解决方案,适用于小型数组,但肯定还有改进的空间。请在评论区告诉我您的想法。
文章来源:https://dev.to/adyngom/javascript-sock-merchant-challenge-solution-1-4knh