【算法】2194. 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 行,并满足

2194. 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 <= r2c1 <= c2

找出所有满足 r1 <= x <= r2c1 <= 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 由大写英文字母、数字、和 ':' 组成

分析

  • 面对这道算法题目,二当家的陷入了沉思。
  • 第一步要能从参数字符串中截取出起始行列和终止行列的值。
  • 第二步遍历生成结果,由于要求结果有序,所以我们如果可以在生成时就满足要求,就可以不用后面再来一次排序了。

题解

java

class Solution {
    public List<String> cellsInRange(String s) {
        List<String> ans = new ArrayList<>();

        char[] cs = new char[2];
        for (cs[0] = s.charAt(0); cs[0] <= s.charAt(3); cs[0]++) {
            for (cs[1] = s.charAt(1); cs[1] <= s.charAt(4); cs[1]++) {
                ans.add(String.valueOf(cs));
            }
        }

        return ans;
    }
}

c

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
char ** cellsInRange(char * s, int* returnSize){
    *returnSize = (s[3] - s[0] + 1) * (s[4] - s[1] + 1);
    char **ans = (char **) malloc(*returnSize * sizeof(char *));
    
    for (char c = s[0]; c <= s[3]; ++c) {
        for (char r = s[1]; r <= s[4]; ++r) {
            int index = (c - s[0]) * (s[4] - s[1] + 1) + (r - s[1]);
            ans[index] = (char *) malloc(3 * sizeof(char));
            ans[index][0] = c;
            ans[index][1] = r;
            ans[index][2] = '\0';
        }
    }

    return ans;
}

c++

class Solution {
public:
    vector<string> cellsInRange(string s) {
        vector<string> ans;
        
        for (char c = s[0]; c <= s[3]; ++c) {
            for (char r = s[1]; r <= s[4]; ++r) {
                ans.push_back({c, r});
            }
        }
        
        return ans;
    }
};

python

class Solution:
    def cellsInRange(self, s: str) -> List[str]:
        return [chr(c) + chr(r) for c in range(ord(s[0]), ord(s[3]) + 1) for r in range(ord(s[1]), ord(s[4]) + 1)]
        

go

func cellsInRange(s string) []string {
    var ans []string

    for c := s[0]; c <= s[3]; c++ {
        for r := s[1]; r <= s[4]; r++ {
            ans = append(ans, string(c)+string(r))
        }
    }

    return ans
}

rust

impl Solution {
    pub fn cells_in_range(s: String) -> Vec<String> {
        let mut ans = Vec::new();

        (s.as_bytes()[0]..(s.as_bytes()[3] + 1)).for_each(|c| {
            (s.as_bytes()[1]..(s.as_bytes()[4] + 1)).for_each(|r| {
                ans.push(String::from_utf8(vec![c, r]).unwrap());
            });
        });
        
        ans
    }
}

javascript

/**
 * @param {string} s
 * @return {string[]}
 */
var cellsInRange = function(s) {
    let ans = [];

    for (let c = s[0].charCodeAt(); c <= s[3].charCodeAt(); c++) {
        for (let r = s[1]; r <= s[4]; r++) {
            ans.push(String.fromCharCode(c) + r);
        }
    }

    return ans;
};

typescript

function cellsInRange(s: string): string[] {
    let ans = [];

    for (let c = s[0].charCodeAt(0); c <= s[3].charCodeAt(0); c++) {
        for (let r = Number.parseInt(s[1]); r <= Number.parseInt(s[4]); r++) {
            ans.push(String.fromCharCode(c) + r);
        }
    }

    return ans;
};

原题传送门:https://leetcode-cn.com/problems/cells-in-a-range-on-an-excel-sheet/


非常感谢你阅读本文~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://developer.aliyun.com/profile/sqd6avc7qgj7y 博客原创~

相关文章
|
5月前
|
自然语言处理 Rust 算法
【算法】13. 罗马数字转整数(多语言实现)
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 | 字符 | 数值 | |--|--| | I | 1 | | V | 5 | | X | 10 | | L | 50 | | C | 100 | | D | 500 | | M | 1000 | 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1
【算法】13. 罗马数字转整数(多语言实现)
excel中同一单元格内容分隔到不同的单元格
excel中同一单元格内容分隔到不同的单元格
excel中同一单元格内容分隔到不同的单元格
|
5月前
|
BI 索引 Python
python报表自动化系列 - 译码:与Excel单元格索引对应的十进制数坐标
python报表自动化系列 - 译码:与Excel单元格索引对应的十进制数坐标
36 1
|
2月前
|
开发工具 开发者
Excel 2016 VBA 提取单元格的中文字符
Excel 2016 VBA 提取单元格的中文字符
18 1
|
3月前
|
自然语言处理 Rust 算法
【算法】17. 电话号码的字母组合(多语言实现)
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
【算法】17. 电话号码的字母组合(多语言实现)
Excel如何使用VBA操作引用其它工作簿中的单元格
Excel引用其它工作簿中的单元格的值及使用VBA操作
|
5月前
|
BI 索引 Python
python报表自动化系列 - Excel单元格(Cell)索引范围对应的所有单元格
python报表自动化系列 - Excel单元格(Cell)索引范围对应的所有单元格
52 0
|
3月前
Excel 下拉选择列表的单元格
Excel 下拉选择列表的单元格
20 0
|
4月前
|
算法 自然语言处理 Rust
【算法】16. 最接近的三数之和(多语言实现)
给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。
|
5月前
|
数据处理
在什么情况下,Excel 单元格内会显示 #VALUE
在什么情况下,Excel 单元格内会显示 #VALUE