Excel 表中某个范围内的单元格
难度:
标签:
题目描述
Excel 表中的一个单元格 (r, c)
会以字符串 "<col><row>"
的形式进行表示,其中:
<col>
即单元格的列号c
。用英文字母表中的 字母 标识。- 例如,第
1
列用'A'
表示,第2
列用'B'
表示,第3
列用'C'
表示,以此类推。
- 例如,第
<row>
即单元格的行号r
。第r
行就用 整数r
标识。
给你一个格式为 "<col1><row1>:<col2><row2>"
的字符串 s
,其中 <col1>
表示 c1
列,<row1>
表示 r1
行,<col2>
表示 c2
列,<row2>
表示 r2
行,并满足 r1 <= r2
且 c1 <= c2
。
找出所有满足 r1 <= x <= r2
且 c1 <= y <= c2
的单元格,并以列表形式返回。单元格应该按前面描述的格式用 字符串 表示,并以 非递减 顺序排列(先按列排,再按行排)。
示例 1:
输入:s = "K1:L2" 输出:["K1","K2","L1","L2"] 解释: 上图显示了列表中应该出现的单元格。 红色箭头指示单元格的出现顺序。
示例 2:
输入:s = "A1:F1" 输出:["A1","B1","C1","D1","E1","F1"] 解释: 上图显示了列表中应该出现的单元格。 红色箭头指示单元格的出现顺序。
提示:
s.length == 5
'A' <= s[0] <= s[3] <= 'Z'
'1' <= s[1] <= s[4] <= '9'
s
由大写英文字母、数字、和':'
组成
代码结果
运行时间: 27 ms, 内存: 16.0 MB
/*
* 思路:
* 1. 使用 IntStream 和 flatMap 生成所有可能的列和行组合。
* 2. 对于每一个列和行的组合,使用映射将其格式化为字符串并收集到列表中。
*/
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Solution {
public List<String> cellsInRange(String s) {
char startCol = s.charAt(0);
char endCol = s.charAt(3);
int startRow = s.charAt(1) - '0';
int endRow = s.charAt(4) - '0';
return IntStream.rangeClosed(startCol, endCol)
.boxed()
.flatMap(col -> IntStream.rangeClosed(startRow, endRow)
.mapToObj(row -> (char) col + String.valueOf(row)))
.collect(Collectors.toList());
}
}
解释
方法:
题解首先通过计算字符和'ord'的差值来确定每个列的索引(从'A'开始计数)。接着将输入字符串s解析出起始和结束的行号和列号。利用双重循环遍历指定范围内的所有单元格,并按照Excel的格式构造单元格名称。最后,尽管结果已经是有序的,但代码中还包括了一个排序步骤,确保输出结果符合先按列后按行的顺序排列。
时间复杂度:
O(n*m log(n*m))
空间复杂度:
O(n*m)
代码细节讲解
🦆
你是如何计算列号`col1`和`col2`的?为什么要在`ord(s[0])`或`ord(s[3])`的基础上减去`ord('A')`然后再加1?
▷🦆
题解中提到对结果列表进行排序,但列表是如何保证在没有排序之前就已经按照要求的非递减顺序排列的?
▷🦆
在单元格名称构造时,为什么使用`chr(col + ord('A') - 1)`来得到列的字母表示?这个表达式是如何工作的?
▷🦆
在实际应用中,如果`col1`和`col2`差距很大,会对算法的性能有什么影响?
▷