Як знайти максимальний елемент масиву?
Коротка відповідь
Максимальний елемент невідсортованого масиву знаходиться за O(n). Для невеликих масивів зручно Math.max(...arr); для надійності й великих масивів - звичайний цикл.
function max(arr) {
if (arr.length === 0) return undefined; // або кинути помилку
let m = arr[0];
for (let i = 1; i < arr.length; i++) {
if (arr[i] > m) m = arr[i];
}
return m;
}
// Приклад
console.log(max([3, 10, -5])); // 10Детальна відповідь
Варіанти рішення
-
Math.max зі spread (просто і наочно, підходить для невеликих масивів):
javascriptconst arr = [3, 10, -5]; const max1 = Math.max(...arr); // 10 // Важливо: Math.max(...[]) === -Infinity; для порожніх масивів потрібна окрема умова. // Для дуже великих масивів spread може викликати помилку "Too many arguments". -
reduce (лаконічно, але враховуйте порожній масив):
javascriptconst arr = [3, 10, -5]; const max2 = arr.reduce((m, x) => (x > m ? x : m), -Infinity); // 10 // Для порожнього масиву поверне -Infinity, перевірте окремо, якщо це неприйнятно. -
Звичайний цикл (найнадійніший і найшвидший для великих масивів):
javascriptfunction maxLoop(arr) { if (arr.length === 0) return undefined; let m = arr[0]; for (let i = 1; i < arr.length; i++) { if (arr[i] > m) m = arr[i]; } return m; } console.log(maxLoop([3, 10, -5])); // 10
Надійна реалізація з перевірками
Суворий варіант: лише числа, NaN заборонено. Кидає помилку при некоректних даних.
function maxNumberStrict(arr) {
if (!Array.isArray(arr)) throw new TypeError('Expected an array');
if (arr.length === 0) return undefined; // або throw
let m;
for (let i = 0; i < arr.length; i++) {
const v = arr[i];
if (typeof v !== 'number' || Number.isNaN(v)) {
throw new TypeError('Array must contain only valid numbers');
}
if (m === undefined || v > m) m = v;
}
return m;
}
console.log(maxNumberStrict([4, 1, 9, 2])); // 9Толерантний варіант: намагається привести значення до числа, пропускаючи нечислові/нескінченні. Зручно для «брудних» даних.
function maxNumberSafe(arr) {
let m = -Infinity;
for (const v of arr) {
const num = Number(v);
if (!Number.isFinite(num)) continue; // пропускаємо NaN/Infinity/нечислове
if (num > m) m = num;
}
return m === -Infinity ? undefined : m;
}
console.log(maxNumberSafe(["7", 3, null, 12, NaN])); // 12
console.log(maxNumberSafe([])); // undefinedМасив об'єктів (max за полем)
function maxBy(arr, selector) {
if (arr.length === 0) return undefined;
let best = arr[0];
let bestKey = selector(best);
for (let i = 1; i < arr.length; i++) {
const key = selector(arr[i]);
if (key > bestKey) {
best = arr[i];
bestKey = key;
}
}
return best;
}
const users = [
{ name: 'A', age: 19 },
{ name: 'B', age: 27 },
{ name: 'C', age: 23 },
];
const oldest = maxBy(users, u => u.age);
console.log(oldest); // { name: 'B', age: 27 }Складність, сортування й великі масиви
-
Складність: O(n) за часом і O(1) за пам'яттю (для циклу/reduce).
-
Не сортуйте масив лише заради максимуму: сортування - O(n log n), це гірше, ніж один прохід.
-
Уникайте Math.max(...arr) для дуже великих масивів: можлива помилка через ліміт кількості аргументів. Використовуйте цикл.
-
TypedArray (Float64Array тощо) перебирайте циклом, це ефективно й безпечно.
-
BigInt: Math.max не працює з BigInt. Використовуйте цикл порівняння BigInt:
javascriptfunction maxBigInt(arr) { if (arr.length === 0) return undefined; let m = arr[0]; // припускаємо BigInt for (let i = 1; i < arr.length; i++) if (arr[i] > m) m = arr[i]; return m; } console.log(maxBigInt([1n, 5n, 3n])); // 5n
Граничні випадки й коректність
- Порожній масив: поверніть undefined або киньте помилку; Math.max(...[]) дає -Infinity - зазвичай це не те, що потрібно.
- NaN/Infinity: вирішіть політику заздалегідь: ігнорувати, кидати помилку чи повертати NaN. Будьте послідовні.
- Змішані типи: приведення до числа може дати NaN; у «суворій» версії краще валідувати типи.
- Уже відсортований масив: максимум - останній елемент, але якщо масив не гарантовано відсортований, все одно потрібен прохід O(n).
Короткі рекомендації
- Невеликі масиви: Math.max(...arr) з перевіркою на порожній масив.
- Великі масиви або продуктивність: класичний цикл.
- «Брудні» дані: версія з пропуском нечислових значень (maxNumberSafe).
- Масив об'єктів: використовуйте maxBy із селектором поля.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.