Как обнулить элементы массива,кроме максимального?
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 шт):
Самый простой способ это перебрать массив еще раз с условием, если число не равняется максимальному, обнулить. Пример:
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);
альтернативный вариант с функциями, если пригодится
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);
На каждой итерации есть два элемента: максимальный и текущий.
Условие должно быть простое: если текущий элемент больше максимального - обнуляем максимальный, если меньше - обнуляем текущий.
Для обнуления максимального - нужно хранить индекс максимального элемента
Тогда условие может быть таким
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);
Можно в процессе сохранять индекс и значение максимального элемента и без разбора всё обнулять. А в конце перебора сделать одну вставку)
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) );