168. Excel Sheet Column Title

Leetcode 问题: 168. Excel Sheet Column Title

题目

Given an integer columnNumber, return its corresponding column title as it appears in an Excel sheet.

传入 栏位数字 columnNumber,回传 Excel 对应的标题

A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28
...

Example

Input: columnNumber = 1
Output: "A"
Input: columnNumber = 28
Output: "AB"
Input: columnNumber = 701
Output: "ZY"

演算法

1. 转换索引对应方式

因为索引是从 1 开始对应到 A,所以将索引值 -1,让索引 0 对应到 A

原索引 对应字母 改变后索引
1 A 0
2 B 1
3 C 2

2. 取馀数计算目前最右侧标题

对传入的栏位数字对 26 取馀数,然后加上起始字母 A 的 Ascii,就可以得到目前最右侧标题的字母 Ascii Code

3. 取得左侧标题

若传入栏位数大于 26 时,则必须继续取得剩馀的左侧标题

所以将栏位数除以 26,然后无条件捨去,传入同一个计算标题函式,就可以继续取得剩馀的左侧标题,直到剩馀栏位数变成 0 无法取得为止

答案

JavaScript

function convertToTitle(columnNumber) {
    if (columnNumber == 0) {
        // 若栏位数是 0,则不需要再计算
        return '';
    }
    // 因为索引是从 1 开始对应到 A,将索引值 -1,让索引 0 对应到 A
    columnNumber--;
    // 目前标题 Ascii Code:取个位数字母 mod 值 + 字串 A Ascii Code 值
    var currentTitleAsciiCode = (columnNumber % 26) + 'A'.charCodeAt(0);
    // 转换目前标题 Ascii Code 为字母
    var currentTitle = String.fromCharCode(currentTitleAsciiCode);
    // 计算是否有剩馀数字,需要加入栏位前方名称
    var remainTitleColumnNumber = Math.floor(columnNumber / 26);
    // 最后标题:馀数标题 + 目前标题
    var finalExcelTitle = convertToTitle(remainTitleColumnNumber) + currentTitle;
    return finalExcelTitle;
}

TypeScript

function convertToTitle(columnNumber: number): string {
    if (columnNumber==0) {
        // 若栏位数是 0,则不需要再计算
        return '';
    }
    // 因为索引是从 1 开始对应到 A,将索引值 -1,让索引 0 对应到 A
    columnNumber--;
    // 目前标题 Ascii Code:取个位数字母 mod 值 + 字串 A Ascii Code 值
    let currentTitleAsciiCode = (columnNumber % 26) + 'A'.charCodeAt(0);
    // 转换目前标题 Ascii Code 为字母
    let currentTitle = String.fromCharCode(currentTitleAsciiCode);
    // 计算是否有剩馀数字,需要加入栏位前方名称
    let remainTitleColumnNumber = Math.floor(columnNumber / 26);
    // 最后标题:馀数标题 + 目前标题
    let finalExcelTitle = convertToTitle(remainTitleColumnNumber) + currentTitle;

    return finalExcelTitle;
};

参考资料