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