设计 Excel 求和公式
难度:
标签:
题目描述
代码结果
运行时间: 29 ms, 内存: 16.2 MB
/*
* Leetcode 631: 设计 Excel 求和公式
*
* 题目思路:
* 1. 我们需要设计一个 Excel 类,该类可以支持设置单元格的值和计算某个单元格的和。
* 2. 使用一个二维数组来表示 Excel 表格。
* 3. 提供 set 方法来设置单元格的值。
* 4. 提供 sum 方法来计算某个单元格的和,可以传入单个单元格或范围。
* 5. 使用哈希表来存储每个单元格的求和公式。
*/
import java.util.HashMap;
import java.util.Map;
import java.util.stream.IntStream;
class Excel {
private int[][] cells;
private Map<String, String[]> formulaMap;
public Excel(int height, char width) {
cells = new int[height + 1][width - 'A' + 1];
formulaMap = new HashMap<>();
}
public void set(int row, char column, int val) {
cells[row][column - 'A'] = val;
formulaMap.remove(row + "_" + column); // 移除该单元格的公式
}
public int get(int row, char column) {
return cells[row][column - 'A'];
}
public int sum(int row, char column, String[] strs) {
int sum = IntStream.of(strs).mapToInt(str -> {
if (str.contains(":")) { // 处理范围
String[] range = str.split(":");
int[] start = parsePosition(range[0]);
int[] end = parsePosition(range[1]);
return IntStream.rangeClosed(start[0], end[0]).flatMap(r ->
IntStream.rangeClosed(start[1], end[1]).map(c -> cells[r][c])
).sum();
} else { // 处理单个单元格
int[] pos = parsePosition(str);
return cells[pos[0]][pos[1]];
}
}).sum();
formulaMap.put(row + "_" + column, strs);
cells[row][column - 'A'] = sum;
return sum;
}
private int[] parsePosition(String str) {
int row = Integer.parseInt(str.substring(1));
int column = str.charAt(0) - 'A';
return new int[]{row, column};
}
}
解释
方法:
这个题解实现了一个简化版的Excel,支持设置单元格的值、获取单元格的值以及计算求和公式。主要思路如下:
1. 使用一个二维列表 `matrix` 来存储Excel表格中每个单元格的值。
2. 使用一个字典 `formulas` 来存储每个单元格的求和公式。
3. `set` 方法用于设置单元格的值,同时删除该单元格的求和公式(如果存在)。
4. `get` 方法用于获取单元格的值,如果该单元格有求和公式,则计算求和公式的结果。
5. `sum` 方法用于计算单元格的求和公式,将求和结果存储到对应单元格,并将求和公式存储到 `formulas` 中。
6. `get_cell_value` 方法用于获取单个单元格或单元格范围的值。
7. `evaluate_formula` 方法用于计算单元格的求和公式的结果。
时间复杂度:
O(nm)
空间复杂度:
O(nm)
代码细节讲解
🦆
在`Excel`类的`sum`方法中,如果在`numbers`参数中有重复的单元格,这些单元格的值是否会被重复计算?如果是,这种设计是否合理?
▷🦆
给定`Excel`类的实现方式,`set`方法在删除求和公式后,是否也应该递归地更新依赖于该单元格的其他公式的值?
▷🦆
在`get_cell_value`方法中处理范围时,如何处理单元格范围跨越多行和列的情况,特别是当输入的起始和结束列字符顺序相反(如`D1:A1`)时?
▷🦆
你的`sum`方法会将公式存储在`formulas`字典中。请问如果一个单元格的求和公式被多次修改,`formulas`字典是如何处理这种情况的?
▷