背景
在一次技术面试中,我的任务是在JavaScript中实现一个缺失的算法。面试官为我提供了一些代码和18个失败的单元测试,一旦算法成功实现,它们就会通过。我确信有一个更有效的方法来解决这个问题,因为我在分配的时间内尝试了几种不同的方法。这种方法是我开始工作的第一种方法。这对于技术测试来说已经足够了,但我想知道解决这个问题的更好的方法。
问题
计算出一副扑克牌中的牌是否是顺子(我已经按升序排列了这副牌)。
我的方案
PokerHand.prototype._check_straight_function = function(arr) {
var isStraight = false;
for (var j = i = 4; i >= 0 && j > 1; i--)
if (arr[i].value() - 1 == arr[--j].value()) {
isStraight = true;
} else {
isStraight = false;
}
};
return isStraight;
};
其他方法
我认为 * 可能 * 会更快工作的事情,如果有人能告诉我以下方法的工作版本,并帮助我了解哪种方法是最快的评估,我将非常感激。
arr.pop().value - 1 == arr.pop().value()
的递归使用filter
数组以创建一个新数组,该数组仅包含下一个索引(arr[++i])
是当前索引+1的值,然后查看新数组是否具有相同的长度。- 一个
for loop
和一个break / continue
在直线结束时立即短路。
6条答案
按热度按时间nhjlsmyf1#
根本不需要给变量isStraight赋值。
qeeaahzv2#
只是把它扔在那里,我认为这一个做它与最少的线(3),无论这是“更好”是主观的,因为它可能不太清楚
vx6bjr1n3#
[original]代码不正确,因为它只会为正在检查的给定对分配
isStraight
(或清除它)。因此,“最后一对”错误地确定了结果。在我的书中“更好的办法”,是保持它的清洁:
如果
zip
高阶函数可用,则可以简化为以下变量:但是
zip
不是标准的。bxpogfeg4#
下面是一个类似的代码,但有一些小的优化(在java中,检查算法)
wr98u20j5#
好吧,这可能更整洁一点。我没看到忍者的方式;(至于比较解决方案--我是一名雇主,就我而言,我更喜欢清晰优雅的答案,而不是快几纳秒的答案:)
i5desfxk6#
这里有另一种方法
DEMO