如何从一个数组里面快速提取连续的数?

苹果小萝卜
  • 5k
var arr = [1, 2, 5, 7, 10, 11, 12, 15, 19, 20, 21, 22];

现在我想从数组里面提取紧挨连续的数,且它们的数量大于等于3.

比如上面的数组里面,应该是[10, 11, 12]和[19, 20, 21, 22]被提取出来

请问有哪些比较快速的方法?

回复
阅读 3k
6 个回答

一次遍历搞定,肯定没有比这更快的方法了。

附上代码:

var arr = [1, 2, 5, 7, 10, 11, 12, 15, 19, 20, 21, 22];
function find(arr) {
    var pre = arr[0];
    var count = 1;
    for (var i = 1; i < arr.length; i++) {
        if (arr[i] == pre + 1) {
            count++;
            pre++;
        } else {
            if (count >= 3) {
                console.log(arr.slice(i - count, i));
            }
            pre = arr[i];
            first = i;
            count = 1;
        }
    }

    if (count >= 3) {
        console.log(arr.slice(i - count, i));
    }
}
find(arr); // [10, 11, 12] [19, 20, 21, 22]

lz 是直接来 要 代码的吧?

  function getArrs(arr){
 var curLength = 0,
     arrLength = arr.length,
     isStart = true,
     sIndex = 0,
     res = [];
    
 
 if (arrLength < 3)
   return res;
 
 for (var i=0; i<arrLength; i++){
    if ( isStart ){
       sIndex = i;
       isStart = false;
    }
    
    if ( arr[i] + 1 === arr[i+1] && i <= arrLength-1 ){
       curLength ++ ;
    }
    else{
       if ( curLength + 1 >= 3 ){
          res.push(arr.slice(sIndex, i+1));
       }
       curLength = 0;
       isStart = true;
    }
 }
 return res;
} 

之前代码确实有问题,没看清题目,已经有人提供了正确的代码

var arr = [1, 2, 5, 7, 10, 11, 12, 13,18, 19, 20, 21, 22,56,57,58];
var result=[[]];
arr.reduce(function(previousValue, currentValue, currentIndex, array) {
    var tempArray=result[result.length-1];
    if(previousValue+1===currentValue){
        if(tempArray.length==0){
            tempArray.push(previousValue);
        }
        tempArray.push(currentValue);
    }else{
        if(tempArray.length>=3){
            result.push([]);
        }else{
            result[result.length-1]=[];
        }
    }

    return currentValue;
});
if(result[result.length-1].length==0){
    result.pop();
}
console.log(result);

前面的大神们都已经有了如此短小精悍的代码实现。
作为一个不是很流弊的我,就不客气的放出冗长,拖沓的代码了哈,提供对比(O(∩_∩)O):

<script>

 var arr=[1,2,5,7,10,11,12,15,19,20,21,22];
 /*----自定义的排序函数---*/
 function arr_sort(arr,tag){
   for (var i=0;i<arr.length;++i)
    {
      var one=arr[i];
      for (var n=i+1;n<arr.length;++n)
       {
         var two=arr[n];
         switch (tag)
         {
           case 'asc':
            if (one>two)
             {
               arr[i]=two;
               arr[n]=one;
             }
            break;
           case 'desc':
            if (one<two)
             {
               arr[i]=two;
               arr[n]=one;
             }
            break;
         }
       }
    }
 }
/*-----提取连续数组元素-----*/
function get_data(arr){
  var result=new Array();
  var index=1;
  arr_sort(arr,'asc');
  function _get_data(){
    var rel=new Array();
    for (var i=index-1;i<arr.length;++i)
     {
       if (rel.length<1)
        {
          rel.push(arr[i]);
        }else{
          for (var n=rel.length-1;n<rel.length;++n)
           {
             if (Math.abs(rel[n]-arr[i])==1)
              {
                var tip=true;
                for (var t=0;t<result.length;++t)
                 {
                   if (result[t]==arr[i])
                    {
                      tip=false;
                      break;
                    }else{
                      tip=true;
                    }
                 }
                 if (tip)
                  {
                    rel.push(arr[i]);
                  }
              }
           }
        }
     }
     if (rel.length>=3)
      {
        result.push(rel);
      }
     if (index<arr.length)
      {
        index++;
        _get_data();
      }
  }
  _get_data();
  var tip=false;
  for (var i=0;i<result.length;++i)
   {
     var pre=result[i];
     if (tip)
      {
        tip=false;
        continue;
      }
     for (var n=0;n<pre.length;++n)
      {
        for (var i1=i+1;i1<result.length;++i1)
         {
           for (var n1=0;n1<result[i1].length;++n1)
            {
              if (tip)
               {
                 break;
               }
              if (pre[n]===result[i1][n1])
               {
                 if (pre.length>result[i1].length)
                  {
                    result.splice(i1,1);
                    i--;
                    i1--;
                    tip=true;
                    break;
                  }else{
                    result.splice(i,1);
                    i--;
                    i1--;
                    tip=true;
                    break;
                  }
               }
            }
         }
      }
   }
  return result;
}
var result=get_data(arr);
alert('原数组是:'+arr.join(' ')+'\n\n'+'提取后的结果是:'+result.join(' ---分隔符--- '));

</script>

你知道吗?

宣传栏