【算法-LeetCode】168. Excel表列名称(Map;进制转换)

LeetCode Excel表列名称转换算法
该博客介绍了如何将整数转换为Excel表的列名称,利用短除法实现逆运算。示例包括从1到2147483647的整数转换,详细解释了算法过程和代码实现,包括对余数为0时的特殊处理。

168. Excel表列名称 - 力扣(LeetCode)

文章更新:2021年10月15日24:44:41

问题描述及示例

给你一个整数 columnNumber ,返回它在 Excel 表中相对应的列名称。

例如,
A -> 1
B -> 2
C -> 3

Z -> 26
AA -> 27
AB -> 28

示例 1:
输入:columnNumber = 1
输出:“A”

示例 2:
输入:columnNumber = 28
输出:“AB”

示例 3:
输入:columnNumber = 701
输出:“ZY”

示例 4:
输入:columnNumber = 2147483647
输出:“FXSHRXW”

提示:
1 <= columnNumber <= 231 - 1

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/excel-sheet-column-title
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

我的题解

此前做过一个进制转换的问题,可做参考:

参考:【算法-LeetCode】171. Excel 表列序号(Math.pow;Map;进制转换)_赖念安的博客-CSDN博客

而本题其实就是上面这道题的逆运算。运用的方法就是【短除法】:

参考:短除法_百度百科

比如对于十进制的 26842730 转换为 26 进制的过程为:

在这里插入图片描述

需要注意的是,如果发现余数为 0,则要将 0 换为 26,并且将原来获得的商减 1

这是为什么呢?我们使用短除法将十进制转换为二进制时就不需要这样做,为什么在这里就要做这个判断呢?

原因就是本题中的 “26进制” 其实不算是标准的 “26进制”,关键就在于本题的 “26进制” 中没有 0 这一位。在十六进制中,基础的数字是 0 ~ F,而在十进制中的基础数字是 0 ~ 9,二进制中的基础数字就是 0 ~ 1。而本题中的基础数字是 A ~ Z,(即 1 ~ 26,如果是标准的二十六进制的话,应该要是 0 ~ 25)。所以说,如果余数为 0 的话,说明,末位的数字已经能向前进一位了,但是由于本题的数字和字母的映射关系的特殊性,末位仍然保留了这个进位。

详解请看下方注释:

/**
 * @param {number} columnNumber
 * @return {string}
 */
var convertToTitle = function(columnNumber) {
  // quotient 是每次短除时得到的商,其初始值即为输入的columnNumber
  let quotient = columnNumber;
  // map用于存储字符与数字之间的映射关系
  let map = new Map();
  // result用于存储由不断拼接而形成的最终结果
  let result = '';
  let str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  // remain 存储每次短除时所得的余数
  let remain = 0;
  for(let i = 0; i < str.length; i++) {
    map.set(i+1, str[i]);
  }
  // 若当前的商不为0,则需要继续短除
  while(quotient) {
    // 获取当前短除所得的余数
    remain = quotient % 26;
    // 如果当前余数不为0,则将更新要用到的商值,
    // 并且根据map中的映射关系将余数对应的字符加到result前面,并直接开始下一次短除
    if(remain) {
      quotient = parseInt(quotient / 26);
      result = map.get(remain) + result;
      continue;
    }
    // 如果当前余数为0,则要原来获取的商值减1,并且将余数改为26,而26对应的字符为Z
    quotient = parseInt((quotient / 26) - 1);
    result = 'Z' + result;
  }
  return result;
};


提交记录
18 / 18 个通过测试用例
状态:通过
执行用时:64 ms, 在所有 JavaScript 提交中击败了87.32%的用户
内存消耗:37.8 MB, 在所有 JavaScript 提交中击败了17.62%的用户
时间:2021/10/14 23:41

官方题解

更新:2021年7月29日18:43:21

因为我考虑到著作权归属问题,所以【官方题解】部分我不再粘贴具体的代码了,可到下方的链接中查看。

更新:2021年10月14日23:34:15

参考:Excel表列名称 - Excel表列名称 - 力扣(LeetCode)

【更新结束】

有关参考

更新:2021年10月14日23:33:44
参考:【算法-LeetCode】171. Excel 表列序号(Math.pow;Map;进制转换)_赖念安的博客-CSDN博客
参考:短除法_百度百科

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值