当前位置: 首页 > news >正文

LeetCode 每日一题 3484. 设计电子表格

3484. 设计电子表格

电子表格是一个网格,它有 26 列(从 ‘A’ 到 ‘Z’)和指定数量的 rows。每个单元格可以存储一个 0 到 105 之间的整数值。
请你实现一个 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 <= 103
0 <= value <= 105
公式保证采用 “=X+Y” 格式,其中 X 和 Y 要么是有效的单元格引用,要么是小于等于 105 的 非负 整数。
每个单元格引用由一个大写字母 ‘A’ 到 ‘Z’ 和一个介于 1 和 rows 之间的行号组成。
总共 最多会对 setCell、resetCell 和 getValue 调用 104 次。


题解

看着题目的描述 “电子表格是一个网格,它有 26 列(从 ‘A’ 到 ‘Z’)和指定数量的 rows”
又是表格又是行列的,第一反应肯定是建立一个二维数组去解决

但是先别急

我们看一下它要实现的功能

  • 指定单元格赋值
  • 指定单元格赋值为 0
  • 访问指定单元格

只有赋值和访问,有的格子还可能用不到
完全可以用哈希表来存储数据
直接将 cell 作为键值存储即可

指定单元格赋值即 将 hash[ cell ] = 赋值
指定单元格赋值为 0 即将 hash[ cell ] = 0
访问指定单元格 即 hash[ cell ]

如果访问到未初始化的数据,哈希表同样是初始化为 0,符合题意

比起直接用二维数组,哈希表优点如下:
题目允许未设置的单元格默认为 0
电子表格通常是稀疏的(大多数单元格未被修改)
实现更简洁,无需处理行列转换
二维数组适合密集数据


代码如下↓

class Spreadsheet {
private:unordered_map<string,int> hash;
public:Spreadsheet(int rows) {}void setCell(string cell, int value) {hash[cell]=value;}void resetCell(string cell) {hash[cell]=0;}int getValue(string formula) {string x;string y;int a;int b;int f=1;for(char i : formula) {if(i=='=')continue;if(i=='+') {f=0;continue;}if(f)x+=i;elsey+=i;}if(x[0]>='A' && x[0]<='Z')a=hash[x];elsea=stoi(x);if(y[0]>='A' && y[0]<='Z')b=hash[y];elseb=stoi(y);return a+b;}
};/*** 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);*/
http://www.dtcms.com/a/391476.html

相关文章:

  • RAGAS深度解析:引领RAG评估新时代的开源技术革命
  • aave v3.4 利率计算详解
  • rook-ceph CRD资源配置时效问题
  • MySQL学习笔记-进阶篇
  • Rust 关键字
  • 排版使用latex排版还是word排版更容易通过mdpi remote sensing的审稿?
  • Qt QML ToolTip弹出方向控制问题探讨
  • [Windows] PDFQFZ(PDF加盖骑缝章) v1.31
  • 四网络层IP-子网掩码-路由表-真题
  • 安装QT6.9.2
  • 使用 NodePort
  • IP6163至为芯具备MPPT硬件算法的太阳能光伏降压DC-DC芯片
  • 从“道生一”理念看宇宙规律与现代科技之关联
  • CKS-CN 考试知识点分享(9) 关闭API凭据自动挂载
  • 初次接触MCP
  • 高防服务器按照应用场景划分为哪些类型
  • 【项目】基于One Thread One Loop模型的高性能网络库实现 - 服务器模块实现
  • 京准电钟NTP时间同步服务器通信系统技术应用方案
  • Next.js 错误处理:自定义错误页面和错误边界
  • 操作教程|使用Cursor工具连接JumpServer资产
  • prefix Lm和causal LM encoder-decoder区别以及各自有什么缺点
  • 从零开始学习PX4源码29(Commander 任务)
  • 基于高速摄像机与6Dof测量的手机跌落实验分析
  • 大恒2509新版本掉线重连
  • 基于Docker Desktop和Windows的Milvus本地部署教程
  • 【Kubernetes】-- Gonzo 之 Go 基于 TUI 的日志分析工具
  • 无人驾驶技术:智能决策与精准执行的融合
  • YOLO11 改进、魔改|RFA(Receptive Field Aggregator)通过分层聚合多尺度感受野,提高多尺度目标检测能力
  • 【人工智能99问】QWen中的动态RoPE与LLaMA中的RoPE有什么区别?(40/99)
  • Function Calling:让语言模型调用外部功能