在JavaScript数组中检查数字序列的最有效方法是什么?

时间:2015-10-07 05:06:22

标签: javascript algorithm

背景

对于技术访谈,我的任务是在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 个答案:

答案 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);

DEMO

答案 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;