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

gijlo24d  于 2023-01-08  发布在  Java
关注(0)|答案(6)|浏览(85)

背景

在一次技术面试中,我的任务是在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在直线结束时立即短路。
nhjlsmyf

nhjlsmyf1#

根本不需要给变量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;
};
qeeaahzv

qeeaahzv2#

只是把它扔在那里,我认为这一个做它与最少的线(3),无论这是“更好”是主观的,因为它可能不太清楚

var last = arr.pop().value(), popped;
    while ((popped = arr.pop().value()) === --last);
    return popped === undefined;
vx6bjr1n

vx6bjr1n3#

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

bxpogfeg

bxpogfeg4#

下面是一个类似的代码,但有一些小的优化(在java中,检查算法)

boolean isStraight = true;
    for (int i = 0; i < 4; i++) {
        if (arr[i] + 1 != arr[i+1]) {
            isStraight = false;
            break;
        }
    };
wr98u20j

wr98u20j5#

好吧,这可能更整洁一点。我没看到忍者的方式;(至于比较解决方案--我是一名雇主,就我而言,我更喜欢清晰优雅的答案,而不是快几纳秒的答案:)

for (var i = 0; i < 5; i++) {
  if (a[i].value() != i + a[0].value())
    return false;
}
return true;
i5desfxk

i5desfxk6#

这里有另一种方法

var isOrdered = true;
[5, 6, 8, 9].sort(function(a, b) {
  (b - a != 1) ? isOrdered = false: true;
});
alert(isOrdered);

DEMO

相关问题