2015-01-14 2 views
0

У меня есть массив чисел, и мне нужно найти максимальный срез массива, который содержит не более двух разных чисел.Максимальный общий срез массива в javascript

так что если у меня есть

[1, 1, 1, 2, 2, 2, 1, 1, 2, 2, 6, 2, 1, 8] 

выход я смотрю на 10, так как массив срез (0, 9) является самым крупным ломтиком массива, не более двух различных чисел.

Как это достичь?

+0

Посмотрите в array.map и Array.filter на https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter – Mouser

+2

вы можете использовать RegExp для этого , а не много циклов – dandavis

+2

Вам не нужно указывать «массив с разделителями-запятыми». Массивы - это массивы. У них нет разделителей, кроме исходного кода, а затем они всегда * разделяются запятыми. – meagar

ответ

1

Этот пример делает трюк для вас. Однако я любезно прошу других богов высших программ улучшить это или предоставить другое решение. Я думаю, что этот код может быть сильно оптимизирован. Прокомментируйте, если вы найдете ошибки или примеры, на которые эта функция возвращает ошибочное решение.

function returnLargestConsecutiveArraySlice(array) 
{ 
    //set an empty array. 
    var a = []; 
    //walk the supplied array and check if number is not repeated 
    array.filter(function (element, index, array) { 
    if (element != array[index-1] && element != array[index+1]) 
    { 
     a.push(index); 
     return element; 
    } 
} 
); 

    //the returned array contains all indexes to the numbers that are not repeated. 
    //walk the array and check if number the next number matches the current one. 
    //If so the index is consecutive. 
    var numbers = a; 
    var b = [[]]; //use an empty array to start with. 
    var index = 0; 
    for (var i = 0; i < numbers.length-1; i++){ 
     if(numbers[i+1] == numbers[i]+1) 
     { 
      //number is consecutive, add. 
      b[index].push(numbers[i]); 
     } 
     else 
     { 
      //chain broken, start a new one. 
      index++; 
      b[index] = []; 
     } 
    } 

    //we now have an array with all chains. Look for the largest chain. 
    var largest = []; 
    for (var i = 0; i < b.length; i++) 
    { 
     if (b[i].length > largest.length) 
     { 
      largest = b[i]; 
     } 
    } 
    //largest chain found. Slice the original array on the largest chain. 
    return array.slice(largest[0], largest[0] + largest.length+1); 
} 

console.log(returnLargestConsecutiveArraySlice([1, 1, 1, 2, 2, 2, 4, 5, 6, 1, 1, 7, 8, 9, 10, 11, 2, 2, 6, 2, 1, 8])); 
Смежные вопросы