背景

在一次技术面试中,我的任务是在 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 loopbreak / continue 以在直线结束时立即短路。
  • 最佳答案

    [原始] 代码不正确,因为它只会为正在检查的给定对分配 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 不是标准的。

    关于javascript - 检查 JavaScript 数组中的数字序列的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32984180/

    10-11 22:01
    查看更多