持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情
题目(Excel Sheet Column Number)
链接:https://leetcode-cn.com/problems/excel-sheet-column-number
解决数:1126
通过率:71.6%
标签:数学 字符串
相关公司:microsoft google amazon
给你一个字符串 columnTitle ,表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。
例如:
A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28
...
示例 1:
输入: columnTitle = "A"
输出: 1
示例 2:
输入: columnTitle = "AB"
输出: 28
示例 3:
输入: columnTitle = "ZY"
输出: 701
提示:
1 <= columnTitle.length <= 7columnTitle仅由大写英文组成columnTitle在范围["A", "FXSHRXW"]内
思路
1.建立字符对应数值字典(A:1, B:2, C:3.....Z:26) 2.从后往前遍历字符串,计算每一位的值 // (因为要确定当前字符所处的位数:个位,十位,百位....需要成不同倍数,所以从后往前取)
代码
/**
* @param {string} columnTitle
* @return {number}
*/
var titleToNumber = function(columnTitle) {
const startCode = 'A'.charCodeAt();
let strMap = {};
let result = 0;
for(let i=0; i<26; i++) {
const key = String.fromCharCode(startCode+i);
strMap[key] = i+1;
}
const len = columnTitle.length-1;
for(let i=len; i>=0; i--) {
result += Math.pow(26, len-i) * strMap[columnTitle[i]]
}
return result
};
思路2
1.先反转; 2.每位上的计算方式为:26的位次幂 * 当前位上的字母所代表的数字; 3.最后累加。
代码
/**
* @param {string} columnTitle
* @return {number}
*/
var titleToNumber = function(columnTitle) {
let char = columnTitle.split('').reverse(); // 先反转
let sum = 0;
char.map((item,index) => {
sum += (item.charCodeAt() - 64) * Math.pow(26, index);
})
return sum;
};
思路3
遍历每个位置:strCode * 26 ** 当前位置距离末尾的距离
代码
/**
* @param {string} columnTitle
* @return {number}
*/
var titleToNumber = function(columnTitle) {
let len = columnTitle.length
let i = 0
let sum = 0
while(i < len) {
sum += (columnTitle.charCodeAt(i) - 64) * 26 ** (len - i++ - 1)
}
return sum
};
思路4
- 从末尾开始取得每一个字符对应的数cur = c.charCodeAt() - 64
- 数字总和sum += 当前数 * 进制位数
- 进制位数 *= 26,初始化进制位数carry = 1
代码
var titleToNumber = function(s) {
let sum = 0, i = s.length - 1, carry = 1;
while (i >= 0) {
let cur = s[i].charCodeAt() - 64;
sum += cur * carry;
carry *= 26;
i--;
}
return sum;
};
思路5
利用Unicode码,计算26进制
代码
function titleToNumber(columnTitle: string): number {
// 所以这就是个26进制?
// 我们都知道A的Unicode码是65 这样所有的字母取码后-64即其所代表的数字,然后与其所在位数关联后相加即可
let len = columnTitle.length,
resNum = 0
for (let z = 0; z < len; z++) {
resNum += (columnTitle[z].charCodeAt(0) - 64) * (26 ** (len - 1 - z))
}
return resNum
};