Skip to content

Latest commit

 

History

History
97 lines (80 loc) · 2.84 KB

168md.md

File metadata and controls

97 lines (80 loc) · 2.84 KB

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