LeetCode 168. Excel表列名称
我们在操作Excel表格时,顶部的展示列名称都是
A
、B
、C
、AB
、BC
、CD
这样的。现在有个要求,提供一个整数columnNumber
,返回它在Excel表中对应的列名称。
对应关系如下:
A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ...
示例:
输入: columnNumber = 28 输出: "AB"
题目分析
从A
到Z
共有26个字母,一一对应了1-26
个数字。在字符串方法中有String.fromCharCode(num)
,将ASCII码值转为对应的字符。
String.fromCharCode(65); // A String.fromCharCode(90); // Z
我们以A的ASCII码值作为起点,重新取描述其他字符
String.fromCharCode(65 + 0); // A String.fromCharCode(65 + 1); // B String.fromCharCode(65 + 25); // Z
看起来像不像26进制
,但实际上对应的数是1-26,所以我们可以将数字自动执行-1,这样就可以与0-25
对应上了。
代码实现
/** * @method convertToTitle * @description: 将整数columnNumber转换为对应的列名称 * @param {number} columnNumber * @return string */ function convertToTitle(columnNumber: number): string { // 定义变量s,依次拼接结果 let s: string = ''; // 遍历columnNumber while (columnNumber) { // 当前数向左移动1位,这样的话就与26进制 - 0-25对应上 columnNumber--; // 将columnNumber对26取余时,可获取最右侧的列字符 // 执行每次结果拼接 s = String.fromCharCode(65 + (columnNumber % 26)) + s; // 每次都除以26,并向下取整,结果是对应前面的N列的 columnNumber = Math.floor(columnNumber / 26); } // 返回结果 return s; }
在这里一定能要弄明白一点就是每新增一个字符长度,都是相当于前面已经满了
N * 26
列了。
功能测试:
console.log(convertToTitle(701)); // ZY console.log(convertToTitle(50)); // AX console.log(convertToTitle(2147483647)); // FXSHRXW
没啥问题。
胡哥小课堂:这道LeetCode题目主要考察了两方面的知识:
- 进制,在我们日常开发中遇到的二进制、八进制、十进制都比较熟悉,这次是换了一个“26进制”的概念;
- 整个题目你可以理解成为进制的转换,就是一个数转换成“26进制”应该怎么处理。
这里悄悄的埋的坑就是是1-26对应,需要每次手动左移一位,因为“26进制中”最大只有25,对应了Z,0对应了A