Сложность: hard
Разработайте базовую функцию Excel и реализуйте функцию формулы суммы. Реализуйте класс Excel: Excel(int height, char width) Инициализирует объект с высотой и шириной листа. Лист представляет собой целочисленную матрицу размером height x width с индексом строки в диапазоне [1, height] и индексом столбца в диапазоне ['A', width]. Все значения должны быть нулевыми изначально. void set(int row, char column, int val) Изменяет значение в mat[row][column] на val. int get(int row, char column) Возвращает значение в mat[row][column]. int sum(int row, char column, List<String> numbers) Устанавливает значение в mat[row][column] как сумму ячеек, представленных числами, и возвращает значение в mat[row][column]. Эта формула суммы должна существовать до тех пор, пока эта ячейка не будет перекрыта другим значением или другой формулой суммы. numbers[i] могут иметь формат: "ColRow", который представляет одну ячейку. Например, "F7" представляет ячейку mat[7]['F']. "ColRow1:ColRow2", который представляет диапазон ячеек. Диапазон всегда будет прямоугольником, где "ColRow1" представляет позицию левой верхней ячейки, а "ColRow2" - позицию правой нижней ячейки.
Например, "B3:F7" представляет ячейки mat[i][j] для 3 <= i <= 7 и 'B' <= j <= 'F'. Примечание: Можно предположить, что не будет никаких ссылок на круговую сумму. Например, mat[1]['A'] == sum(1, "B") и mat[1]['B'] == sum(1, "A").
Пример:
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 {
private $mat;
private $formulas;
public function __construct($height, $width) {
$this->mat = array_fill(0, $height, array_fill(0, ord($width) - ord('A') + 1, 0));
$this->formulas = [];
}
public function set($row, $column, $val) {
$this->mat[$row - 1][ord($column) - ord('A')] = $val;
unset($this->formulas["$row$column"]);
}
public function get($row, $column) {
$key = "$row$column";
if (isset($this->formulas[$key])) {
return $this->evaluateFormula($key);
}
return $this->mat[$row - 1][ord($column) - ord('A')];
}
public function sum($row, $column, $numbers) {
$key = "$row$column";
$this->formulas[$key] = $numbers;
return $this->evaluateFormula($key);
}
private function evaluateFormula($key) {
$numbers = $this->formulas[$key];
$total = 0;
foreach ($numbers as $number) {
if (strpos($number, ':') !== false) {
list($start, $end) = explode(':', $number);
$startRow = (int)substr($start, 1);
$startCol = $start[0];
$endRow = (int)substr($end, 1);
$endCol = $end[0];
for ($r = $startRow; $r <= $endRow; $r++) {
for ($c = ord($startCol); $c <= ord($endCol); $c++) {
$total += $this->get($r, chr($c));
}
}
} else {
$r = (int)substr($number, 1);
$c = $number[0];
$total += $this->get($r, $c);
}
}
return $total;
}
}Ставь 👍 и забирай 📚 Базу знаний
