Задача: 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;
}
}Ставь 👍 и забирай 📚 Базу знаний
