Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情
一、题目描述:
给你一个整数 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"
二、思路与实现:
思路:
- 先取余数,然后余数 + 64 获得字符(不是+65的原因是题目的A从1开始,要减去1)
- 然后减去余数再除26,刚好除得尽,新的一位开始
代码实现:
/**
* @param {number} columnNumber
* @return {string}
*/
var convertToTitle = function(n) {
if (n <= 0) return "";
let res = [];
while(n) {
let remain = n % 26 ? n % 26 : 26; // 类似 十进制的 521 进行不断取余
res.unshift(String.fromCharCode(remain + 64)); // 然后余数 + 64 获得字符(不是+65的原因是题目的A从1开始,要减去1)
n = Math.floor((n - remain) / 26); // 然后减去余数再除26,刚好除得尽,新的一位开始
}
return res.join("");
};
三、总结:
这个题还可以反过来问:
给你一个字符串 columnTitle ,表示 Excel 表格中的列名称。返回 该列名称对应的列序号。
示例 1:
输入: columnTitle = "A"
输出: 1
示例 2:
输入: columnTitle = "AB"
输出: 28
示例 3:
输入: columnTitle = "ZY"
输出: 701
JS 实现:
function titleToNumber(columnTitle: string): number {
// 所以这就是个26进制?
// 我们都知道A的Unicode码是65 这样所有的字母取码后-64即其所代表的数字,然后与其所在位数关联后相加即可
let len = columnTitle.length,
resNum = 0
for (let z = 0; z < len; z++) {
resNum += (columnTitle[z].charCodeAt(0) - 64) * (26 ** (len - 1 - z))
}
return resNum
};
时间复杂度:O(n),其中 nn 是列名称 columnTitle 的长度。需要遍历列名称一次。
空间复杂度:O(1)。
这两题都相较基础,继续加油~~