🎈 算法并不一定都是很难的题目,也有很多只是一些代码技巧,多进行一些算法题目的练习,可以帮助我们开阔解题思路,提升我们的逻辑思维能力,也可以将一些算法思维结合到业务代码的编写思考中。简而言之,平时进行的算法习题练习带给我们的好处一定是不少的,所以让我们一起来养成算法练习的习惯。今天练习的题目是一道比较简单的题目 ->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
由大写英文字母、数字、和':'
组成
思路分析
首先我们应该要先理解一下题目意思,题目会给我们一个字符串s
,s
的格式为单元格1:单元格2
,行用数字表示,列用大写字母表示:A
代表第一列,B
代表第二列…… 如B2:D4
,表示从第二行第二列到第四行第四列之间的单元格,如下图:
其中包含的单元格分别为[B2,B3,B4,C2,C3,C4,D2,D3,D4]
.
所以我们只需要确认一下包含的行和列号,再遍历一下取出其中包含的单元格即可,我们可以先将列号转为数字:String.charCodeAt()
,如'A'.charCodeAt() = 65
,遍历过程中再将列号转换成字母即可:String.fromCharCode(number)
,如String.fromCharCode(65) = 'A'
。而且题目中说到:
s.length == 5
'A' <= s[0] <= s[3] <= 'Z'
'1' <= s[1] <= s[4] <= '9'
所以我们可以知道行数的范围为:s[1] - s[4]
,列数的范围为s[0] - s[3]
,进行两层遍历找出其中包含的单元格即可。
AC 代码
完整 AC 代码如下:
/** * @param {string} s * @return {string[]} */ var cellsInRange = function (s) { const maxNum = Number(s[4]), minNum = Number(s[1]); const maxLetter = s[3].charCodeAt(), minLetter = s[0].charCodeAt(); const res = []; for (let i = minLetter; i <= maxLetter; i++) { for (let j = minNum; j <= maxNum; j++) { res.push(String.fromCharCode(i) + j); } } return res; };
公众号
关注公众号『前端也能这么有趣
』,获取更多有趣内容。
说在后面
🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『
前端也能这么有趣
』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。