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;
};

參考資料