Easy

题目描述

Excel 表中的一个单元格 (r, c) 会以字符串 “” 的形式进行表示,其中:

  • <col> 即单元格的列号 c 。用字母表中的字母标识。
    • 例如,第 1 列用 ‘A’ 表示,第 2 列用 ‘B’ 表示,第 3 列用 ‘C’ 表示,以此类推。
  • <row> 即单元格的行号 r 。第 r 行就用整数 r 标识。

给你一个格式为 “:” 的字符串 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 由大写英文字母、数字和 ‘:’ 组成

解题思路

解题思路

这是一个相对简单的字符串处理题目,主要考查对 Excel 单元格格式的理解和双重循环的使用。

核心思路:

  1. 解析输入字符串,提取起始和结束的列号与行号
  2. 按照"先列后行"的顺序生成所有符合条件的单元格

具体步骤:

  1. 从输入字符串 s 中提取起始列 col1s[0])、起始行 row1s[1])、结束列 col2s[3])、结束行 row2s[4]
  2. 使用双重循环遍历:
    • 外层循环遍历列:从 col1col2
    • 内层循环遍历行:从 row1row2
  3. 对于每个 (列, 行) 组合,构造单元格字符串并添加到结果列表

时间复杂度分析: 由于列数和行数都最多为 9(根据约束条件),所以最多有 9×9=81 个单元格,时间复杂度为常数级别。

这种按列优先的遍历顺序天然保证了结果的有序性,无需额外排序操作。

代码实现

class Solution {
public:
    vector<string> cellsInRange(string s) {
        char col1 = s[0], col2 = s[3];
        char row1 = s[1], row2 = s[4];
        
        vector<string> result;
        
        for (char col = col1; col <= col2; col++) {
            for (char row = row1; row <= row2; row++) {
                result.push_back(string(1, col) + string(1, row));
            }
        }
        
        return result;
    }
};
class Solution:
    def cellsInRange(self, s: str) -> List[str]:
        col1, row1, col2, row2 = s[0], s[1], s[3], s[4]
        
        result = []
        
        for col in range(ord(col1), ord(col2) + 1):
            for row in range(ord(row1), ord(row2) + 1):
                result.append(chr(col) + chr(row))
        
        return result
public class Solution {
    public IList<string> CellsInRange(string s) {
        char col1 = s[0], col2 = s[3];
        char row1 = s[1], row2 = s[4];
        
        IList<string> result = new List<string>();
        
        for (char col = col1; col <= col2; col++) {
            for (char row = row1; row <= row2; row++) {
                result.Add(col.ToString() + row.ToString());
            }
        }
        
        return result;
    }
}
/**
 * @param {string} s
 * @return {string[]}
 */
var cellsInRange = function(s) {
    const col1 = s[0], col2 = s[3];
    const row1 = s[1], row2 = s[4];
    
    const result = [];
    
    for (let col = col1.charCodeAt(0); col <= col2.charCodeAt(0); col++) {
        for (let row = row1.charCodeAt(0); row <= row2.charCodeAt(0); row++) {
            result.push(String.fromCharCode(col) + String.fromCharCode(row));
        }
    }
    
    return result;
};

复杂度分析

复杂度类型复杂度说明
时间复杂度O(1)由于列数和行数都最多为 9,最多遍历 9×9=81 次,为常数时间
空间复杂度O(1)除了存储结果的数组外,只使用了常数个变量

相关题目