Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查JavaScript数组中的数字序列最有效的方法是什么? 背景_Javascript_Algorithm - Fatal编程技术网

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

检查JavaScript数组中的数字序列最有效的方法是什么? 背景,javascript,algorithm,Javascript,Algorithm,在一次技术面试中,我的任务是用JavaScript实现一个缺失的算法。面试官向我提供了一些代码和18个失败的单元测试,一旦算法成功实现,这些测试将通过。我确信有一种更有效的方法来解决这个问题,因为我在分配的时间里尝试了几种不同的方法。这种方法是我开始工作的第一种方法,对于技术测试来说已经足够了,但是我想知道一种更好的解决问题的方法 问题 计算出扑克牌中的牌是否是直的。(我已经按升序订购了手牌。) 我的解决方案 其他办法 如果有人能告诉我以下方法的有效版本,并帮助我了解哪种方法最快进行评估,我将非

在一次技术面试中,我的任务是用JavaScript实现一个缺失的算法。面试官向我提供了一些代码和18个失败的单元测试,一旦算法成功实现,这些测试将通过。我确信有一种更有效的方法来解决这个问题,因为我在分配的时间里尝试了几种不同的方法。这种方法是我开始工作的第一种方法,对于技术测试来说已经足够了,但是我想知道一种更好的解决问题的方法

问题 计算出扑克牌中的牌是否是直的。(我已经按升序订购了手牌。)

我的解决方案 其他办法 如果有人能告诉我以下方法的有效版本,并帮助我了解哪种方法最快进行评估,我将非常感激

  • 递归使用
    arr.pop().value-1==arr.pop().value()
  • 筛选
    数组以创建仅包含下一个索引(
    arr[++i])为当前索引+1的值的新数组
    然后查看新数组的长度是否相同
  • a
    用于回路
    ,带有一个
    断开/继续
    ,以在直线末端立即短路
由于[原始]代码将仅为正在检查的给定对分配
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
不是标准的。

这里有一个类似的代码,有一些轻微的优化(在java中,检查算法)

布尔isStraight=true;
对于(int i=0;i<4;i++){
如果(arr[i]+1!=arr[i+1]){
isStraight=false;
打破
}
};

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

仅仅是把它扔出去,我认为这一个用最少的行(3)来做,是否“更好”是主观的,因为它可能不太清楚

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

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

for(变量i=0;i<5;i++){
如果(a[i].value()!=i+a[0].value())
返回false;
}
返回true;
这里是另一种方法

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

手牌中的牌是否已排序?看起来您的问题可能更适合@StinePike是的,每行(我已经按升序对牌进行了排序)代码不正确,因为它将仅为要检查的给定对分配isStraight(或清除它)。因此,“最后一对”错误地确定了结果。因为数组已经排序,我们知道有直线的一个必要条件是第一个卡值和最后一个卡值之间的差正好是四。如果要检查大量阵列,而其中大多数阵列都未通过测试,则添加此测试可能会提高全局性能。旁注:如果我们知道所有卡片都有不同的值,这就成为一个充分条件。这不是答案。这应该作为注释。我已经修复了错误,这取决于我编写代码以通过测试,而不是解决问题。$不过我确实喜欢高阶函数的想法。我喜欢
对a.value()+1==b.value()的否定+1因此,
返回false
将在直线序列中断时使环路短路。我喜欢的。我想只要恢复这种状态也行吗?这可能是错误地假设返回
true==continue
false==break
谢谢。你说的返回条件是什么意思?返回true类似于continue,返回false类似于“break”yes。(取决于代码的其余部分)我的意思是,您能否在for循环中返回
if
的值?e、 g.
返回arr[i].value()-1==arr[i-1].value()
假设如果返回值为真,循环将继续,如果条件为假,则短路。我不明白。您希望返回什么值(以及为什么)?需要if语句来检查条件是否告诉“这不是一个有序数字序列吗?-然后返回false…”如果是一个有序数字序列,它将继续for循环。它在for循环后返回true,因为这样我们就可以确定数组中的所有项都是按升序排列的。因此,是的,false会使电路短路,而返回true将继续它。虽然可读性不强,但很酷的实现,实际上是另一种选择:-)谢谢!看起来确实有点疯狂,但它使用的是OP想知道的流行音乐,而且我很少使用没有主体的循环,所以我喜欢在这里使用一个。我喜欢这个,谢谢。我认为pop实现看起来很相似。
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;
};
    var last = arr.pop().value(), popped;
    while ((popped = arr.pop().value()) === --last);
    return popped === undefined;
for (var i = 0; i < 5; i++) {
  if (a[i].value() != i + a[0].value())
    return false;
}
return true;
var isOrdered=true;
[5,6,8,9].sort(function(a, b) {
  (b-a != 1)?isOrdered=false:true;
});
alert(isOrdered);