var arr = [1, 2, 5, 7, 10, 11, 12, 15, 19, 20, 21, 22];
现在我想从数组里面提取紧挨连续的数,且它们的数量大于等于3.
比如上面的数组里面,应该是[10, 11, 12]和[19, 20, 21, 22]被提取出来
请问有哪些比较快速的方法?
之前代码确实有问题,没看清题目,已经有人提供了正确的代码
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);
二分查找好像
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, 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]
前面的大神们都已经有了如此短小精悍的代码实现。
作为一个不是很流弊的我,就不客气的放出冗长,拖沓的代码了哈,提供对比(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>