题目重点:先实现可验证的字面值API,再明确公式等后续需求。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 地址大写字母列+正整数行,如A1/AA10;无限稀疏表,无固定尺寸。
- 仅存字面值int/float/string/bool/None;未知单元格None。字符串= A1一类内容也按普通文本,不实现未明确的两个扩展需求。
解题路线
- 用地址作hash键,set覆盖、get默认None。先校验地址和值再写入,避免半更新。地址前导零拒绝,防A01/A1不同键却同格。
- None是空值也可显式设置,因此该API不区分未设置与已设None;若面试要求区分,增加exists或独立sentinel。
- 公式会引入解析、依赖图、环检测与缓存失效,属于新合同,不能随意用eval来填补。数值类型、错误值、范围引用和批量事务也需按实际需求逐层追加。
手动走一遍
set A1为3后get A1=3,再设hello覆盖;get B1=None。set C1为字符串=A1保留字符串,不推断其是公式。
Python 参考实现
下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。
代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。
import re
class Sheet:
def __init__(self):self.cells={}
@staticmethod
def key(address):
if not isinstance(address,str) or not re.fullmatch(r"[A-Z]+[1-9][0-9]*",address):raise ValueError("cell address")
return address
def set_cell(self,address,value):
if type(value) not in (int,float,str,bool,type(None)):raise ValueError("literal value required")
self.cells[self.key(address)]=value
def get_cell(self,address):return self.cells.get(self.key(address),None)
复杂度
地址长度L,校验/hash O(L),map平均O(1)访问,空间O(单元格数+地址/值总长度)。
易错点与追问
容易失分的边界
- 空格、行0或A01必须有清楚规范。
- 用float统一所有值会丢大整数精度和文本类型。
继续深挖
- 引入公式时如何维护逆依赖并检测循环?
- 未设与显式空值在复制粘贴和删除中怎样区分?
