Как обнулить элементы массива,кроме максимального?

let arr = [16, -37, 54, -4, 72, -56, 47, 4, -16, 25, -37, 46, 4, -51, 27, -63, 4, -54, 76, -4, 12, -35, 4, 47];
let max = arr[0];

for (let i = 0; i < arr.length; i++) {
  if (arr[i] > max) {
    max = arr[i];
  }

  if (arr[i] !== max) {
    arr[i] = 0;
  }
}

console.log(arr);

Вроде написал правильно,но обнуляет не все значения


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

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

Самый простой способ это перебрать массив еще раз с условием, если число не равняется максимальному, обнулить. Пример:

let arr =  [16,-37,54,-4,72,-56,47,4,-16,25,-37,46,4,-51,27,-63,4,-54,76,-4,12,-35,4,47];
let max = arr[0];

for (let i = 0; i < arr.length; i++) {
    if (arr[i] > max) {
        max = arr[i];
    }
}

let res = arr.map(val => max !== val ? 0 : val);
console.log(res);
→ Ссылка
Автор решения: teran

альтернативный вариант с функциями, если пригодится

let arr =  [16,-37,54,-4,72,-56,47,4,-16,25,-37,46,4,-51,27,-63,4,-54,76,-4,12,-35,4,47];

const max = Math.max(...arr);
const result = arr.map(v => v == max ? v : 0);

console.log(result);

→ Ссылка
Автор решения: Grundy

На каждой итерации есть два элемента: максимальный и текущий.

Условие должно быть простое: если текущий элемент больше максимального - обнуляем максимальный, если меньше - обнуляем текущий.

Для обнуления максимального - нужно хранить индекс максимального элемента

Тогда условие может быть таким

if (arr[i] > max) {
    max = arr[i];
    arr[maxi] = 0;
    maxi = i;
} else {
    arr[i] = 0;
}

В дополнении, проверку можно начинать со второго элемента, либо проверить, что i не совпадает с maxi - иначе обнулятся все элементы.

Пример:

let arr = [167, -37, 54, -4, 72, -56, 47, 4, -16, 25, -37, 46, 4, -51, 27, -63, 4, -54, 76, -4, 12, -35, 4, 47];
let max = arr[0];
let maxi = 0;
for (let i = 1; i < arr.length; i++) {
  if (arr[i] > max) {
    max = arr[i];
    arr[maxi] = 0;
    maxi = i;
  } else {
    arr[i] = 0;
  }
}

console.log(arr);

Либо начальное значение для максимального элемента указать минимальным:

let arr = [167, -37, 54, -4, 72, -56, 47, 4, -16, 25, -37, 46, 4, -51, 27, -63, 4, -54, 76, -4, 12, -35, 4, 47];
let max = -Infinity;
let maxi = -1;
for (let i = 0; i < arr.length; i++) {
  if (arr[i] > max) {
    max = arr[i];
    if (maxi > -1)
      arr[maxi] = 0;
    maxi = i;
  } else {
    arr[i] = 0;
  }
}

console.log(arr);

→ Ссылка
Автор решения: OPTIMUS PRIME

Можно в процессе сохранять индекс и значение максимального элемента и без разбора всё обнулять. А в конце перебора сделать одну вставку)

let arr = [16, -37, 54, -4, 72, -56, 47, 4, -16, 25, -37, 46, 4, -51, 27, -63, 4, -54, 76, -4, 12, -35, 4, 47];

let max = {n: arr[0], i: 0};
for( let i = 0; i < arr.length; i++ ) {
  if( arr[i] > max.n ) max = {n: arr[i], i: i};
  arr[i] = 0;
}
arr[ max.i ] = max.n;

console.log( JSON.stringify(arr) );

→ Ссылка