【LeetCode - 每日1题】设计电子表格
🌈 个人主页:(时光煮雨)
🔥 高质量专栏:vulnhub靶机渗透测试
👈 希望得到您的订阅和支持~
💡 创作高质量博文(平均质量分95+),分享更多关于网络安全、Python领域的优质内容!(希望得到您的关注~)
🌵目录🌵
- 难度 ⭐⭐⭐
- 题目回顾
- ✅解题思路
-
- 💖概述
- 💓核心思路
- ✅代码实现
- ✅代码分析
- ✅ 复杂度分析
- ✅ 测试用例验证
-
- ✅ 示例1
- ✅ 示例2
- ✅ 边缘用例
- 💖总结
- 🤝 期待与你共同进步
- 📚 参考文档
难度 ⭐⭐⭐
题目回顾
电子表格是一个网格,它有 26 列(从 ‘A’ 到 ‘Z’)和指定数量的 rows。每个单元格可以存储一个 0 到 10**5 之间的整数值。
请你实现一个 Spreadsheet 类:
- Spreadsheet(int rows) 初始化一个具有 26 列(从 ‘A’ 到 ‘Z’)和指定行数的电子表格。所有单元格最初的值都为 0 。
- void setCell(String cell, int value) 设置指定单元格的值。单元格引用以 “AX” 的格式提供(例如,“A1”,“B10”),其中字母表示列(从 ‘A’ 到 ‘Z’),数字表示从 1 开始的行号。
- void resetCell(String cell) 重置指定单元格的值为 0 。
- int getValue(String formula) 计算一个公式的值,格式为 “=X+Y”,其中 X 和 Y 要么 是单元格引用,要么非负整数,返回计算的和。
注意: 如果 getValue 引用一个未通过 setCell 明确设置的单元格,则该单元格的值默认为 0 。
示例 1:
输入:
[“Spreadsheet”, “getValue”, “setCell”, “getValue”, “setCell”,
“getValue”, “resetCell”, “getValue”] [[3], [“=5+7”], [“A1”, 10],
[“=A1+6”], [“B2”, 15], [“=A1+B2”], [“A1”], [“=A1+B2”]]
输出:
[null, 12, null, 16, null, 25, null, 15]
解释
Spreadsheet spreadsheet = new Spreadsheet(3); // 初始化一个具有 3 行和 26 列的电子表格
spreadsheet.getValue(“=5+7”); // 返回 12 (5+7)
spreadsheet.setCell(“A1”, 10); // 设置 A1 为 10
spreadsheet.getValue(“=A1+6”); // 返回 16 (10+6)
spreadsheet.setCell(“B2”, 15); // 设置 B2 为 15
spreadsheet.getValue(“=A1+B2”); // 返回 25 (10+15)
spreadsheet.resetCell(“A1”); // 重置 A1 为 0
spreadsheet.getValue(“=A1+B2”); // 返回 15 (0+15)提示:
- 1 <= rows <= 10**3
- 0 <= value <= 10**5
- 公式保证采用 “=X+Y” 格式,其中 X 和 Y
- 要么是有效的单元格引用,要么是小于等于 10**5 的 非负 整数。
- 每个单元格引用由一个大写字母 ‘A’ 到 ‘Z’ 和一个介于 1 和 rows 之间的行号组成。 总共 最多会对 setCell、resetCell 和 getValue 调用 10**4 次。
✅解题思路
💖概述
实现一个电子表格类,支持设置单元格值、重置单元格值以及解析简单加法公式(格式为 =X+Y)。核心是通过字典存储非零单元格,未设置的单元格默认为0。
💓核心思路
- 存储设计:使用字典 data存储被修改过的单元格(键为单元格名称如 “A1”,值为整数),未存储的单元格默认值为0。
- 公式解析:
- 去掉公式开头的 =,按 +分割成两部分。
- 判断每部分是单元格引用(首字母大写)还是数字字符串:
- 单元格引用:从 data中取值(不存在则返回0)。
- 数字字符串:直接转为整数。
- 将两部分结果相加返回。
- 重置操作:直接从字典中移除单元格,使其恢复默认值0。
✅代码实现
class Spreadsheet:def __init__(self, _):self.data = {}def setCell(self, cell: str, value: int