LeetCode - 171 - Excel表列序号(excel-sheet-column-number)

栏目: IT技术 · 发布时间: 5年前

内容简介:LeetCode - 171 - Excel表列序号(excel-sheet-column-number)

Create by jsliang on 2019-07-06 14:55:42
Recently revised in 2019-07-06 14:55:46

一 目录

不折腾的前端,和咸鱼有什么区别

| 目录 | | --- | | 一 目录 | | 二 前言 | | 三 解题 | |  3.1 解法 - Map() + 数学 | |  3.2 解法 - 数学解法 |

二 前言

  • 难度:简单

  • 涉及知识:数学

  • 题目地址:https://leetcode-cn.com/problems/excel-sheet-column-number/

  • 题目内容

  1. 给定一个Excel表格中的列名称,返回其相应的列序号。

  2. 例如,

  3. A -> 1

  4. B -> 2

  5. C -> 3

  6. ...

  7. Z -> 26

  8. AA -> 27

  9. AB -> 28

  10. ...

  11. 示例 1:

  12. 输入: "A"

  13. 输出: 1

  14. 示例 2:

  15. 输入: "AB"

  16. 输出: 28

  17. 示例 3:

  18. 输入: "ZY"

  19. 输出: 701

三 解题

小伙伴可以先自己在本地尝试解题,再回来看看 jsliang 的解题思路。

3.1 解法 - Map() + 数学

  • 解题代码

  1. var titleToNumber = function(s) {

  2. let map = new Map();

  3. map.set('A', 1);

  4. map.set('B', 2);

  5. map.set('C', 3);

  6. map.set('D', 4);

  7. map.set('E', 5);

  8. map.set('F', 6);

  9. map.set('G', 7);

  10. map.set('H', 8);

  11. map.set('I', 9);

  12. map.set('J', 10);

  13. map.set('K', 11);

  14. map.set('L', 12);

  15. map.set('M', 13);

  16. map.set('N', 14);

  17. map.set('O', 15);

  18. map.set('P', 16);

  19. map.set('Q', 17);

  20. map.set('R', 18);

  21. map.set('S', 19);

  22. map.set('T', 20);

  23. map.set('U', 21);

  24. map.set('V', 22);

  25. map.set('W', 23);

  26. map.set('X', 24);

  27. map.set('Y', 25);

  28. map.set('Z', 26);

  29. let time = 0;

  30. let result = 0;

  31. let convert = function(s) {

  32. let now = s.shift();

  33. if (now !== undefined) {

  34. result += map.get(now) * Math.pow(26, time);

  35. time++;

  36. convert(s);

  37. }

  38. }

  39. convert(s.split('').reverse());

  40. return result;

  41. };

  • 执行测试

  1. s: ZZZ

  2. return: 18278

  • LeetCode Submit

  1. Accepted

  2. 1000/1000 cases passed (108 ms)

  3. Your runtime beats 74.27 % of javascript submissions

  4. Your memory usage beats 5.33 % of javascript submissions (37.7 MB)

  • 知识点

  1. Map:保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。 Map 详细介绍

  2. Math:JS 中的内置对象,具有数学常数和函数的属性和方法。 Math 详细介绍

  3. shift(): shift() 方法从数组中删除第一个元素,并返回该元素的值。此方法更改数组的长度。 shift() 详细介绍

  4. split(): split() 方法使用指定的分隔符字符串将一个 String 对象分割成字符串数组,以将字符串分隔为子字符串,以确定每个拆分的位置。 split() 详细介绍

  5. reverse(): reverse() 方法将数组中元素的位置颠倒,并返回该数组。该方法会改变原数组。 reverse() 详细介绍

  • 解题思路

首先,对于找规律题,我们完全不需要怂,毕竟谁没被 “数学奥林匹克竞赛” 折磨过~

然后,我们开始找规律:

  • A-Z:1 ~ 26

  • AA:1 * 26^1 + 1 * 26^0

  • ZZ:26 * 26^1 + 26 * 26^0

  • AAA:1 * 26^2 + 1 * 26^1 + 1 * 26^0

  • ZZZ:26 * 26^2 + 26 * 26^1 + 26 * 26^0

什么?你居然没有看懂?

AZ 对应的是不是 1 至 26?

然后 AA 是 27,那么这个 27 是怎么得到的呢?即 26 + 1,即 1 乘于 26 的 1 次方,再加上 1 乘于 26 的 0 次方;

然后 ZZ 是 702,那么这个 702 是怎么得到的呢?即 26 * 26 + 26,即 26 乘于 26 的 1 次方,再加上 26 乘于 26 的 0 次方。

这么说小伙伴们是不是一目明了?看出这规律了?

接着,我们只需要使用一个递归,用来从尾到头依次转换字母为数字:

  1. let convert = function(s) {

  2. let now = s.shift();

  3. if (now !== undefined) {

  4. result += map.get(now) * Math.pow(26, time);

  5. time++;

  6. convert(s);

  7. }

  8. }

  9. convert(s.split('').reverse());

最后,我们将这个数字返回出去即可。

3.2 解法 - 数学解法

  • 解题代码

  1. var titleToNumber = function (s) {

  2. let sum = 0;

  3. let base = 1;

  4. for (let char of [...s].reverse()) {

  5. sum += (char.charCodeAt() - 64) * base;

  6. base *= 26;

  7. }

  8. return sum;

  9. };

  • 执行测试

  1. s: ZZZ

  2. return: 18278

  • LeetCode Submit

  1. Accepted

  2. 1000/1000 cases passed (100 ms)

  3. Your runtime beats 86.32 % of javascript submissions

  4. Your memory usage beats 24.67 % of javascript submissions (35.5 MB)

  • 知识点

  1. reverse(): reverse() 方法将数组中元素的位置颠倒,并返回该数组。该方法会改变原数组。 reverse() 详细介绍

  2. charCodeAt(): charCodeAt() 获得字母对应的 ASCII 编码,例如 A - 65。 charCodeAt() 详细介绍

  • 解题思路

如果小伙伴了解了第一个题解,那么这个也难不住小伙伴们了,简洁便利的方法,越看越发美妙~


不折腾的前端,和咸鱼有什么区别!

LeetCode - 171 - Excel表列序号(excel-sheet-column-number)

jsliang 会每天更新一道 LeetCode 题解,从而帮助小伙伴们夯实原生 JS 基础,了解与学习算法与数据结构。

扫描上方二维码,关注 jsliang 的公众号,让我们一起折腾!

LeetCode - 171 - Excel表列序号(excel-sheet-column-number)

jsliang 的文档库 由 梁峻荣 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
基于https://github.com/LiangJunrong/document-library上的作品创作。
本许可协议授权之外的使用权限可以从 https://creativecommons.org/licenses/by-nc-sa/2.5/cn/ 处获得。



以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Effective C++

Effective C++

梅耶 (Scott Meyers) / 侯捷 / 电子工业出版社 / 2011-1-1 / 65.00元

《Effective C++:改善程序与设计的55个具体做法(第3版)(中文版)(双色)》内容简介:有人说C++程序员可以分为两类,读过Effective C++的和没读过的。世界项级C++大师scott Meyers成名之作的第三版的确当得起这样的评价。当您读过《Effective C++:改善程序与设计的55个具体做法(第3版)(中文版)(双色)》之后,就获得了迅速提升自己C++功力的一个契机......一起来看看 《Effective C++》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具