SWE · Coding

Spreadsheet基础set/get:地址校验与字面值存储

先实现可验证的字面值API,再明确公式等后续需求。

题目重点:先实现可验证的字面值API,再明确公式等后续需求。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 地址大写字母列+正整数行,如A1/AA10;无限稀疏表,无固定尺寸。
  • 仅存字面值int/float/string/bool/None;未知单元格None。字符串= A1一类内容也按普通文本,不实现未明确的两个扩展需求。

解题路线

  1. 用地址作hash键,set覆盖、get默认None。先校验地址和值再写入,避免半更新。地址前导零拒绝,防A01/A1不同键却同格。
  2. None是空值也可显式设置,因此该API不区分未设置与已设None;若面试要求区分,增加exists或独立sentinel。
  3. 公式会引入解析、依赖图、环检测与缓存失效,属于新合同,不能随意用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统一所有值会丢大整数精度和文本类型。

继续深挖

  • 引入公式时如何维护逆依赖并检测循环?
  • 未设与显式空值在复制粘贴和删除中怎样区分?
✓已复制微信号!