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博客
而本题其实就是上面这道题的逆运算。运用的方法就是【短除法】:
参考:短除法_百度百科
比如对于十进制的 2684
和 2730
转换为 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
【更新结束】
有关参考
更新:2021年10月14日23:33:44
参考:【算法-LeetCode】171. Excel 表列序号(Math.pow;Map;进制转换)_赖念安的博客-CSDN博客
参考:短除法_百度百科