TGViewer
JavaScript | LeetCode JavaScript | LeetCode @easy_frontend_task · 8.3K subscribers
Post #1989 604
Сложность: hard
Задача: 631. Design Excel Sum Formula

Имеется n различных онлайн-курсов, пронумерованных от 1 до n. Вам дан массив courses, где courses[i] = [durationi, lastDayi] указывает, что i-й курс должен быть пройден непрерывно в течениеi дней и должен быть закончен до или в lastDayi. Вы начинаете в 1-й день и не можете проходить два или более курсов одновременно. Верните максимальное количество курсов, которые вы можете пройти.

Пример:
Input
["Excel", "set", "sum", "set", "get"]
[[3, "C"], [1, "A", 2], [3, "C", ["A1", "A1:B2"]], [2, "B", 2], [3, "C"]]
Output
[null, null, 4, null, 6]


👨‍💻 Алгоритм:

1⃣Инициализация
Создайте класс Excel, который будет инициализировать матрицу нужного размера и хранить текущие значения ячеек. Реализуйте методы для установки значений, получения значений и вычисления суммы.

2⃣Метод установки значений
Реализуйте метод set, который будет изменять значение ячейки в матрице.

3⃣Метод вычисления суммы
Реализуйте метод sum, который будет вычислять сумму значений ячеек, указанных в списке numbers. Метод должен поддерживать как одиночные ячейки, так и диапазоны ячеек.

😎 Решение:
class Excel {
constructor(height, width) {
this.mat = Array.from({ length: height }, () => Array(width.charCodeAt(0) - 'A'.charCodeAt(0) + 1).fill(0));
this.formulas = new Map();
}

set(row, column, val) {
this.mat[row - 1][column.charCodeAt(0) - 'A'.charCodeAt(0)] = val;
this.formulas.delete(`${row},${column}`);
}

get(row, column) {
const key = `${row},${column}`;
if (this.formulas.has(key)) {
return this._evaluateFormula(key);
}
return this.mat[row - 1][column.charCodeAt(0) - 'A'.charCodeAt(0)];
}

sum(row, column, numbers) {
const key = `${row},${column}`;
this.formulas.set(key, numbers);
return this._evaluateFormula(key);
}

_evaluateFormula(key) {
const numbers = this.formulas.get(key);
let total = 0;
for (const number of numbers) {
if (number.includes(":")) {
const [start, end] = number.split(":");
const startRow = parseInt(start.slice(1));
const startCol = start.charCodeAt(0);
const endRow = parseInt(end.slice(1));
const endCol = end.charCodeAt(0);
for (let r = startRow; r <= endRow; r++) {
for (let c = startCol; c <= endCol; c++) {
total += this.get(r, String.fromCharCode(c));
}
}
} else {
const r = parseInt(number.slice(1));
const c = number.charAt(0);
total += this.get(r, c);
}
}
return total;
}
}


Ставь 👍 и забирай 📚 Базу знаний
More from @easy_frontend_task
  1. Oct 14, 2026Post #2575
  2. Oct 13, 2026Задача: 687. Longest Univalue Path Сложность: medium Дано корень бинарного дерева, верните…
  3. Oct 11, 2026Задача: 651. 4 Keys Keyboard Сложность: medium Представьте, что у вас есть специальная кла…
  4. Oct 9, 2026Задача: 1054. Distant Barcodes Сложность: medium На складе имеется ряд штрих-кодов, где i-…
  5. Oct 9, 2026Задача: 1237. Find Positive Integer Solution for a Given Equation Сложность: medium Если д…
  6. Oct 8, 2026Задача: №19. Remove Nth Node From End of List Сложность: medium Дан связанный список и чис…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →