繁体   English   中英

查找Array是否包含Javascript的5个连续数字

[英]Find if Array Contains 5 consecutive Numbers with Javascript

我有一个包含数字的排序数组。 我想能够检查这个数组(或类似的数组)是否包含连续顺序的5个数字。

注意:数组可能包含重复和双位数字。

我正在尝试这个,但是没有史诗般的失败。

var array = [1,3,5,7,7,8,9,10,11]
var current = null;
var cnt = 0;
for (var i = 0; i < array.length; i++) {
    if (array[i] != current) {
        if (cnt > 4) {
            return true;
        }
        current = array[i];
        cnt = 1;
    } else {
        cnt++;
    }

}
if (cnt > 4) {
    return true;
}

}

一种功能性方法

function fiveInARow(array) {

  // compare if one element is greater than or equal to the previous one
  function compare(elt, i, arr) { return !i || elt >= arr[i-1]; });

  // check if at a given position, every one of the last five comparisons is true
  function check (_, i, greaters) { 
    return i >= 4 && greaters.slice(i-4, i) . every(Boolean);                         
  }

  return array . map(compare) . some(check);
}

这里的逻辑是首先使用map创建一个布尔数组,显示每个元素是否大于或等于前一个元素。 这会产生一个数组,如[true, true, true, false, true]

some部分要求,对于任何元素,是否该元素和前四个元素中的每一个都是真的? 如果是,则返回true

递归解决方案

递归解决方案可能更容易阅读。

function fiveInARow(array) {

  return function _five(array, prev, n) {
    if (n >= 5)        return true;
    if (!array.length) return false;

    var next = array.shift();
    return _five(array, next, next === prev ? n : next >= prev ? n+1 : 0);
  }(array, -999999, 5);

}

一种迭代,直接的方法是:

var should_be_true = [1,3,5,7,7,8,9,10,11];
var should_be_false = [1,3,5,7,9,11,13,15,17];

var testArray = function(array) {
    var conseq = 1;
    for (var idx = 1; idx < array.length ; idx++) {
        if (array[idx] == array[idx-1] + 1)
            conseq++;
        else
            conseq = 1;
        if (conseq == 5)
            return true;
    }
    return false;
}

console.log(testArray(should_be_true)); //true
console.log(testArray(should_be_false)); //false

但是为了奖励乐趣,这里是函数方法的一个变体,返回序列开始的位置,如果不存在足够长的序列,则返回-1:

should_be_true.map(function(curr,idx,arr) {
    return (curr == arr[idx-1] +1) ? 1 : 0;
}).join('').search(/1{4}/); 
var array = [1,3,5,7,7,8,9,10,11];
var cons=false;
var count=0;
for(i=0;i<array.length;i++){
    if(array[i]+1==array[i+1]){
        count++;
    }
    else{
        count=0;
    }
    if(count==4){
        cons=true;
    }
}
if(cons){
    //do what you want with it
}

DEMO

更优雅的方法是在函数中定义整个事物,如下所示:

function checkCons(array){
    var cons=false;
    var count=0;
    for(i=0;i<array.length;i++){
        if(array[i]+1==array[i+1]){
            count++;
        }
        else{
            count=0;
        }
        if(count==4){
            cons=true;
        }
    }
    return cons;
}

然后像这样使用它:

var array = [1,3,5,7,7,8,9,10,11];
if(checkCons(array)){
    //do what you want with it
}

DEMO

   function fiveStraight() {
       var array = [1, 3, 5, 7, 7, 8, 9, 10, 12];
       var prev = array[0];
       var numberOfStraight = 1;

       for (var i = 1; i < array.length; i++) {
           numberOfStraight = array[i] === prev + 1 ? numberOfStraight + 1 : 1;
           prev = array[i];
           if (numberOfStraight === 5) return true;
       }

       return false;
   }

JSFIDDLE

这是我发现最直接的方法。 降序和升序值都计为连续值(如果不是你的情况,那么请调用Math.abs()调用)。

function consecutiveValuesCount(array) {
    // sort the values if not pre-sorted
    var sortedValues = array.sort();

    // the result variable / how many consecutive numbers did we find?
    // there's always atleast 1 consecutive digit ...
    var count = 1;
    for (var i = 0; i < sortedValues.length - 1; i++) {
        // both descending and ascending orders count as we are using Math.abs()
        if (Math.abs(sortedValues[i] - sortedValues[i+1]) == 1) {
          ++count;
        }
    }
    return count;
}

//input
var array = [1,2,4,5,3];
// output
5

当它击中两个7时, cnt只会增加一次。

将递增行放在truthy条件中,将重置行放在else语句中。

 // Put into a function for testing. function foo() { var array = [1, 3, 5, 7, 7, 8, 9, 10, 11] var current = null; var cnt = 0; for (var i = 0; i < array.length; i++) { // Also need to make sure the next array item is a consecutive increase. if (array[i] != current && array[i] === array[i-1] + 1) { if (cnt > 4) { return true; } current = array[i]; cnt++; } else { cnt = 1; } } if (cnt > 4) { return true; } else { return false; } }; // Call function. alert(foo()); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM