Welcome to Subscribe On Youtube
3484. Design Spreadsheet
Description
A spreadsheet is a grid with 26 columns (labeled from 'A'
to 'Z'
) and a given number of rows
. Each cell in the spreadsheet can hold an integer value between 0 and 105.
Implement the Spreadsheet
class:
Spreadsheet(int rows)
Initializes a spreadsheet with 26 columns (labeled'A'
to'Z'
) and the specified number of rows. All cells are initially set to 0.void setCell(String cell, int value)
Sets the value of the specifiedcell
. The cell reference is provided in the format"AX"
(e.g.,"A1"
,"B10"
), where the letter represents the column (from'A'
to'Z'
) and the number represents a 1-indexed row.void resetCell(String cell)
Resets the specified cell to 0.int getValue(String formula)
Evaluates a formula of the form"=X+Y"
, whereX
andY
are either cell references or non-negative integers, and returns the computed sum.
Note: If getValue
references a cell that has not been explicitly set using setCell
, its value is considered 0.
Example 1:
Input:
["Spreadsheet", "getValue", "setCell", "getValue", "setCell", "getValue", "resetCell", "getValue"]
[[3], ["=5+7"], ["A1", 10], ["=A1+6"], ["B2", 15], ["=A1+B2"], ["A1"], ["=A1+B2"]]
Output:
[null, 12, null, 16, null, 25, null, 15]
Explanation
Spreadsheet spreadsheet = new Spreadsheet(3); // Initializes a spreadsheet with 3 rows and 26 columnsspreadsheet.getValue("=5+7"); // returns 12 (5+7)
spreadsheet.setCell("A1", 10); // sets A1 to 10
spreadsheet.getValue("=A1+6"); // returns 16 (10+6)
spreadsheet.setCell("B2", 15); // sets B2 to 15
spreadsheet.getValue("=A1+B2"); // returns 25 (10+15)
spreadsheet.resetCell("A1"); // resets A1 to 0
spreadsheet.getValue("=A1+B2"); // returns 15 (0+15)
Constraints:
1 <= rows <= 103
0 <= value <= 105
- The formula is always in the format
"=X+Y"
, whereX
andY
are either valid cell references or non-negative integers with values less than or equal to105
. - Each cell reference consists of a capital letter from
'A'
to'Z'
followed by a row number between1
androws
. - At most
104
calls will be made in total tosetCell
,resetCell
, andgetValue
.
Solutions
Solution 1: Hash Table
We use a hash table
When calling the setCell
method, we store the cell reference and value in the hash table.
When calling the resetCell
method, we remove the cell reference from the hash table.
When calling the getValue
method, we split the formula into two cell references, calculate their values, and then return their sum.
The time complexity is
-
class Spreadsheet { private Map<String, Integer> d = new HashMap<>(); public Spreadsheet(int rows) { } public void setCell(String cell, int value) { d.put(cell, value); } public void resetCell(String cell) { d.remove(cell); } public int getValue(String formula) { int ans = 0; for (String cell : formula.substring(1).split("\\+")) { ans += Character.isDigit(cell.charAt(0)) ? Integer.parseInt(cell) : d.getOrDefault(cell, 0); } return ans; } } /** * Your Spreadsheet object will be instantiated and called as such: * Spreadsheet obj = new Spreadsheet(rows); * obj.setCell(cell,value); * obj.resetCell(cell); * int param_3 = obj.getValue(formula); */
-
class Spreadsheet { private: unordered_map<string, int> d; public: Spreadsheet(int rows) {} void setCell(string cell, int value) { d[cell] = value; } void resetCell(string cell) { d.erase(cell); } int getValue(string formula) { int ans = 0; stringstream ss(formula.substr(1)); string cell; while (getline(ss, cell, '+')) { if (isdigit(cell[0])) { ans += stoi(cell); } else { ans += d.count(cell) ? d[cell] : 0; } } return ans; } }; /** * Your Spreadsheet object will be instantiated and called as such: * Spreadsheet* obj = new Spreadsheet(rows); * obj->setCell(cell,value); * obj->resetCell(cell); * int param_3 = obj->getValue(formula); */
-
class Spreadsheet: def __init__(self, rows: int): self.d = {} def setCell(self, cell: str, value: int) -> None: self.d[cell] = value def resetCell(self, cell: str) -> None: self.d.pop(cell, None) def getValue(self, formula: str) -> int: ans = 0 for cell in formula[1:].split("+"): ans += int(cell) if cell[0].isdigit() else self.d.get(cell, 0) return ans # Your Spreadsheet object will be instantiated and called as such: # obj = Spreadsheet(rows) # obj.setCell(cell,value) # obj.resetCell(cell) # param_3 = obj.getValue(formula)
-
type Spreadsheet struct { d map[string]int } func Constructor(rows int) Spreadsheet { return Spreadsheet{d: make(map[string]int)} } func (this *Spreadsheet) SetCell(cell string, value int) { this.d[cell] = value } func (this *Spreadsheet) ResetCell(cell string) { delete(this.d, cell) } func (this *Spreadsheet) GetValue(formula string) int { ans := 0 cells := strings.Split(formula[1:], "+") for _, cell := range cells { if val, err := strconv.Atoi(cell); err == nil { ans += val } else { ans += this.d[cell] } } return ans } /** * Your Spreadsheet object will be instantiated and called as such: * obj := Constructor(rows); * obj.SetCell(cell,value); * obj.ResetCell(cell); * param_3 := obj.GetValue(formula); */
-
class Spreadsheet { private d: Map<string, number>; constructor(rows: number) { this.d = new Map<string, number>(); } setCell(cell: string, value: number): void { this.d.set(cell, value); } resetCell(cell: string): void { this.d.delete(cell); } getValue(formula: string): number { let ans = 0; const cells = formula.slice(1).split('+'); for (const cell of cells) { ans += isNaN(Number(cell)) ? this.d.get(cell) || 0 : Number(cell); } return ans; } } /** * Your Spreadsheet object will be instantiated and called as such: * var obj = new Spreadsheet(rows) * obj.setCell(cell,value) * obj.resetCell(cell) * var param_3 = obj.getValue(formula) */