leetcode 3484. 设计电子表格 中等
电子表格是一个网格,它有 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
要么是有效的单元格引用,要么是小于等于105
的 非负 整数。 - 每个单元格引用由一个大写字母
'A'
到'Z'
和一个介于1
和rows
之间的行号组成。 - 总共 最多会对
setCell
、resetCell
和getValue
调用10^4
次。
分析:按照要求模拟即可。
typedef struct {int rows;int **sheet;
} Spreadsheet;Spreadsheet* spreadsheetCreate(int rows) {Spreadsheet * s=(Spreadsheet*)malloc(sizeof(Spreadsheet));s->rows=rows;s->sheet=(int**)malloc(sizeof(int*)*(rows+5));for(int i=0;i<=rows;++i){s->sheet[i]=(int*)malloc(sizeof(int)*30);for(int j=0;j<30;++j)s->sheet[i][j]=0;}return s;
}void spreadsheetSetCell(Spreadsheet* obj, char* cell, int value) {int ind1=0,ind2=0;for(int i=0;cell[i];++i){if(!i)ind1=cell[i]-'A'+1;else ind2=ind2*10+cell[i]-'0';}// printf("set ind1=%d ind2=%d val=%d\n",ind1,ind2,value);obj->sheet[ind2][ind1]=value;return;
}void spreadsheetResetCell(Spreadsheet* obj, char* cell) {int ind1=0,ind2=0;for(int i=0;cell[i];++i){if(!i)ind1=cell[i]-'A'+1;else ind2=ind2*10+cell[i]-'0';}// printf("reset ind1=%d ind2=%d\n",ind1,ind2);obj->sheet[ind2][ind1]=0;return;
}int spreadsheetGetValue(Spreadsheet* obj, char* formula) {int ind1=0,ind2=0,ind3=0,ind4=0,sum=0,f1=0,f2=0,i=0;for(i=1;formula[i];++i){if(formula[i]>='A'&&formula[i]<='Z')ind1=formula[i]-'A'+1,f1=1;else if(formula[i]=='+')break;else if(f1)ind2=ind2*10+formula[i]-'0';else ind2=ind2*10+formula[i]-'0';}i++;for(i;formula[i];++i){if(formula[i]>='A'&&formula[i]<='Z')ind3=formula[i]-'A'+1,f2=1;else if(f2)ind4=ind4*10+formula[i]-'0';else ind4=ind4*10+formula[i]-'0';}// printf("ind1=%d ind2=%d val1=%d ind3=%d ind4=%d val2=%d\n",ind1,ind2,obj->sheet[ind1][ind2],ind3,ind4,obj->sheet[ind3][ind4]);// printf("f1=%d f2=%d\n",f1,f2);if(f1)sum+=obj->sheet[ind2][ind1];else sum+=ind2;if(f2)sum+=obj->sheet[ind4][ind3];else sum+=ind4;return sum;
}void spreadsheetFree(Spreadsheet* obj) {for(int i=0;i<obj->rows;++i)free(obj->sheet[i]);free(obj);
}/*** Your Spreadsheet struct will be instantiated and called as such:* Spreadsheet* obj = spreadsheetCreate(rows);* spreadsheetSetCell(obj, cell, value);* spreadsheetResetCell(obj, cell);* int param_3 = spreadsheetGetValue(obj, formula);* spreadsheetFree(obj);
*/