Напишите скрипт, который находит максимальную последовательность одинаковых элементов в массиве. Если их больше одной, вернуть первую

Напишите скрипт, который находит максимальную последовательность одинаковых элементов в массиве. Если их больше одной, вернуть первую.

** Example:** [2, 1, 1, 2, 3, 3, 2, 2, 2, 1] -> [2, 2, 2].

*/

let arr = [2, 1, 1, 2, 3, 3, 2, 2, 2, 1];
let result;
let max = 0;
let count;
for (let i = 0; i < arr.length; i++) {
    count = 0;
    for (let k = i; k < arr.length; k++) {
        if (arr[i] === arr[k])
            ++count;
    }
    if (count > max) 
        max = count;
        result = arr[i];
console.log(result);     
}
    
let newArr = new Array(max);
console.log(newArr.fill(result));

Не могу понять, где ошибка. Должно быть три двойки, а выходит пять единиц.


Ответы (1 шт):

Автор решения: wololo

Первая ошибка здесь:

for (let i = 0; i < arr.length; i++) {
    count = 0;
    for (let k = i; k < arr.length; k++) {
        if (arr[i] === arr[k])
            ++count;

Если текущая последовательность повторяющихся значений с началом в позиции i прервалась (нарушено условие arr[i] === arr[k]), то продолжать цикл k не нужно. Ведь иначе к текущей последовательности будут приплюсованы значения равные arr[i], но находящиеся после неравного элемента.

Вторая ошибка здесь:

if (count > max) 
    max = count;
    result = arr[i];

Одних только отступов не достаточно. Нужны фигурные скобки.

Итого:

let arr = [2, 1, 1, 2, 3, 3, 2, 2, 2, 1];
let result;
let max = 0;
for (let i = 0; i < arr.length; i++) {
    let count = 0;
    for (let k = i; k < arr.length; k++) {
        if (arr[i] === arr[k])
            ++count;
        else
            break;
    }
    if (count > max) {
        max = count;
        result = arr[i];
    }  
}

let newArr = new Array(max);
console.log(newArr.fill(result));

И ещё, ваш алгоритм имеет квадратичную сложность. Но решить задачу можно пройдясь по массиву ровно один раз. Примерно так:

function getMaxSeq(arr) {
    if (arr.length === 0)
        return [];

    let maxPos = 0, pos = 0;
    let maxLen = 1, len = 1;

    for (let i = 1; i < arr.length; ++i)
        if (arr[i] === arr[i-1])
            ++len;
        else {
            if (len > maxLen) {
                maxPos = pos;
                maxLen = len;
            }
            pos = i;
            len = 1;
        }
    if (len > maxLen) {
        maxPos = pos;
        maxLen = len;
    }

    return arr.slice(maxPos, maxPos + maxLen);
}

let arr = [2, 1, 1, 2, 3, 3, 2, 2, 2, 1];
console.log(getMaxSeq(arr));

→ Ссылка