LeetCode 168. Excel Sheet Column Title

題目

Given a positive integer, return its corresponding column title as appear in an Excel sheet.

For example:

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

翻譯

給一個正整數,回傳在excel表格中對應的欄位。

思路

下表的來源

A   1     AA    26+ 1     BA  2×26+ 1     ...     ZA  26×26+ 1     AAA  1×26²+1×26+ 1
B   2     AB    26+ 2     BB  2×26+ 2     ...     ZB  26×26+ 2     AAB  1×26²+1×26+ 2
.   .     ..    .....     ..  .......     ...     ..  ........     ...  .............   
.   .     ..    .....     ..  .......     ...     ..  ........     ...  .............
.   .     ..    .....     ..  .......     ...     ..  ........     ...  .............
Z  26     AZ    26+26     BZ  2×26+26     ...     ZZ  26×26+26     AAZ  1×26²+1×26+26

觀察上面表格可以知道數字轉換成excel欄位是一個類似27進位的轉換,不過規則有一點點不同。

ABC = 1x26^2 + 2x26^1 + 3 ,看起來可以用 String.fromCharCode(n%26 + 64)直接將數字轉成英文字母
ZZZ =26x26^2 + 26x26^1 + 26,可是當n=26,也就是字母Z的時候,26%26 = 0,反而不能得到正確的字母Z
因此改用String.fromCharCode((n-1)%26 + 65)處理

解題

/**
 * @param {number} n
 * @return {string}
 */
var convertToTitle = function(n) {
    // String.fromCharCode(65) = 'A', String.fromCharCode(66) = 'B' ..... String.fromCharCode(90) = 'Z'

    // 比27小的時候,可以直接用String.fromCharCode(n)轉換成英文字母
    if(n-1 < 26){
        return String.fromCharCode(65+(n-1)%26);
    }

    var result = "";

    while(n > 0){
        var codeNum = (n-1)%26;
        var c = String.fromCharCode(codeNum+65);
        result = c + result;

        n = parseInt((n-1) / 26);
    }
    return  result;
};

亂湊出來的解法

/**
 * @param {number} n
 * @return {string}
 */
var convertToTitle = function(n) {
    // String.fromCharCode(65) = 'A', String.fromCharCode(66) = 'B' ..... String.fromCharCode(90) = 'Z'
    // 比27小的時候,可以直接用String.fromCharCode(n)轉換成英文字母
    if(n < 27){
        return String.fromCharCode(64+n%27);
    }

    var result = "";

    while(n > 0){
        var c = ""

        if(n%26 == 0) {
            // n=26時候代表的字母應該為'Z',不過n%26 = 0,因此直接用n%26+64不會得到Z 
            c = String.fromCharCode(90);
            n  = parseInt(n/26)-1;    
        } else {
            // 'A' = charCode(1+64),剩下的字母一樣推算 
            c = String.fromCharCode(n%26+64);
            n  = parseInt(n/26);
        }
        result = c + result;
    }
    return  result;
};

results matching ""

    No results matching ""