LeetCode 算法题解之 26 进制转换 All In One
26 进制转换
171
. Excel Sheet Column Number
171
. Excel 工作表列号
function titleToNumber(columnTitle: string): number {
// 如何动态生成 字典 ✅ 26 进制
// A-Z -> 1-26
const strs = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
const obj = {};
for(let i = 0; i < strs.length; i++) {
obj[strs[i]] = i + 1;
}
let result = 0
const arr = columnTitle.split('')
let n = arr.length;
for(let i = 0; i < n; i++) {
let num = obj[arr[i]];
result += num * 26 ** (n - i - 1);
}
return result
};
/*
str = `A`
str.charAt(0)
// 65
str.charCodeAt(0)
// 65
str.codePointAt(0)
// 65
*/
https://leetcode.com/problems/excel-sheet-column-number/
168.
Excel Sheet Column Title
168.
Excel 工作表列头
function convertToTitle(n: number): string {
let result = ``
while (n > 0) {
// 取余数
let digit = n % 26
// 向下取整,防止小数 bug ✅
n = Math.floor(n / 26)
if (digit === 0) {
n -= 1
digit = 26
}
// 64 => '@',ASCII code / UTF-16
let char = String.fromCharCode(64 + digit)
// 前面插入
result = char + result
}
return result
};
/*
ASCII code / UTF-16
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode
*/
// function convertToTitle(columnNumber:number):string {
// let str:string = ``;
// let num:number;
// while (columnNumber > 0) {
// // ???
// num = (columnNumber - 1) % 26;
// str = String.fromCharCode(num + 65) + str;
// columnNumber = Math.floor((columnNumber - num) / 26);
// }
// return str;
// };
// function convertToTitle(columnNumber: number): string {
// // 如何动态生成 字典 ✅ 26 进制
// // A-Z -> 1-26
// const strs = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
// const obj = {};
// for(let i = 0; i < strs.length; i++) {
// // obj[strs[i]] = i + 1;
// obj[i + 1] = strs[i];
// }
// // const dict = new Map();
// let num = columnNumber;
// let n = 1;
// let result = ``;
// // 求余数
// let rest = num % 26;
// if(rest === 0) {
// result += obj[26];
// } else {
// result += obj[rest];
// }
// // 减余数
// num = num - rest;
// // 进位,n 倍
// while(num > 0) {
// // 求除数 ❌
// // let left = num / (26 ** n);
// let left = Math.floor(num / (26 ** n));
// if(left > 26) {
// left = 26
// result += obj[26];
// } else {
// result += obj[left];
// }
// // 进位,n 倍
// num = num - (left * 26 ** n);
// n += 1;
// }
// // console.log(`result =`, result)
// return [...result].reverse().join(``);
// };
/*
2147483647
"denifednuZZZZZW" ❌
"FXSHRXW"
"YZY"
25 * 26 * 26 +
26 * 26 +
25
17601
"AZY"
1 * 26 * 26 +
26 * 26 + 25
1377
// 26**1 -> Z
// 26**2 -> ZZ ??? 没有 0 怎么进位 ❓
// 2 进制 0 ~ 1,8 进制 0 ~ 7, 16 进制 0 ~ F
"ZY"
26 * 26 + 25
701
*/
/*
1
28
701
17601
Input: columnNumber = 701
Output: "ZY"
26 * 26 + 25
701
26 进制 ✅
{1: 'A', 2: 'B', 3: 'C', 4: 'D', 5: 'E', 6: 'F', 7: 'G', 8: 'H', 9: 'I', 10: 'J', 11: 'K', 12: 'L', 13: 'M', 14: 'N', 15: 'O', 16: 'P', 17: 'Q', 18: 'R', 19: 'S', 20: 'T', 21: 'U', 22: 'V', 23: 'W', 24: 'X', 25: 'Y', 26: 'Z'}
*/
https://leetcode.com/problems/excel-sheet-column-title/