对于技术访谈,我的任务是在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
就会短路。 答案 0 :(得分:2)
根本不需要分配变量isStraight。
PokerHand.prototype._check_straight_function = function(arr) {
for (var i = i = 4; i++) {
if (arr[i].value() - 1 != arr[i-1].value()) {
return false;
}
};
return true;
};
答案 1 :(得分:2)
把它扔到那里,我认为这个用最少量的线(3)来做,无论是否是"更好"是主观的,因为它可能不太清楚
var last = arr.pop().value(), popped;
while ((popped = arr.pop().value()) === --last);
return popped === undefined;
答案 2 :(得分:2)
这是另一种方式
var isOrdered=true;
[5,6,8,9].sort(function(a, b) {
(b-a != 1)?isOrdered=false:true;
});
alert(isOrdered);
答案 3 :(得分:1)
[原始]代码不正确,因为它仅为要检查的给定对分配 isStraight
(或清除它)。因此,“最后一对”错误地确定了结果。
在我的书中,“更好的方法”是保持清洁:
for (var i = 0; i < 4; i++) {
var a = arr[i]; // arr[0..3]
var b = arr[i+1]; // arr[1..4]
if (!(a.value() + 1 == b.value())) {
return false; // Not sequential
}
};
return true;
如果zip
高阶函数可用,则可以将其作为
arr.zip(function (a, b) { return [a.value(), b.value()] })
.every(function (x) { return x[0] + 1 === x[1] })
但zip
不是标准。
答案 4 :(得分:1)
这是一个类似的代码,带有一些小的优化(在java中,检查算法)
boolean isStraight = true;
for (int i = 0; i < 4; i++) {
if (arr[i] + 1 != arr[i+1]) {
isStraight = false;
break;
}
};
答案 5 :(得分:1)
嗯,这可能有点整洁。我没有看到Ninja的方式;(至于比较解决方案 - 我是雇主,而就我而言,我更喜欢那个清晰而优雅的答案,而且速度快几毫秒:)
for (var i = 0; i < 5; i++) {
if (a[i].value() != i + a[0].value())
return false;
}
return true;