Напишите скрипт, который находит максимальную последовательность одинаковых элементов в массиве. Если их больше одной, вернуть первую
Напишите скрипт, который находит максимальную последовательность одинаковых элементов в массиве. Если их больше одной, вернуть первую.
** 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 шт):
Первая ошибка здесь:
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));