【LeetCode-数学】Excel表列序号
题目描述
给定一个Excel表格中的列名称,返回其相应的列序号。
字母和数字的对应关系如下
A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28
...
示例:
输入: "A"
输出: 1
输入: "AB"
输出: 28
输入: "ZY"
输出: 701
题目链接: https://leetcode-cn.com/problems/excel-sheet-column-number/
思路1
这个问题是 26 进制数转 10 进制数的问题。对于 10 进制数 1986 有
1986 = 1*10^3+9*10^2+8*10^1+6*10^1
所以,对于 26 进制数 AB 来说,有
AB = A*26 + B = 1*26 + 2 = 28
代码如下:
class Solution {
public:
int titleToNumber(string s) {
if(s.empty()) return 0;
if(s.size()==1) return s[0]-'A'+1;
int ans = 0;
int n = s.size();
for(int i=n-1; i>=0; i--){
ans = ans + (s[i]-'A'+1)*pow(26, n-i-1);
}
return ans;
}
};
上面是反向遍历的,也可以正向遍历
class Solution {
public:
int titleToNumber(string s) {
if(s.empty()) return 0;
if(s.size()==1) return s[0]-'A'+1;
int ans = 0;
int n = s.size();
for(int i=0; i<n; i++){
if(i<n-1) ans = ans + (s[i]-'A'+1)*pow(26, n-1-i);
else ans += s[i]-'A'+1;
}
return ans;
}
};
思路2
正向遍历有更简单的写法。考虑 10 进制数 1986:
int ans = 0;
ans = ans*10 + 1; // 1
ans = ans*10 + 9; // 19
ans = ans*10 + 8; // 19
ans = ans*10 + 6; // 1986
所以,对于 26 进制数 AB:
int ans = 0;
ans = ans*26 + A; // 1
ans = ans*26 + B; // 1*26+2=28
代码如下:
class Solution {
public:
int titleToNumber(string s) {
if(s.empty()) return 0;
if(s.size()==1) return s[0]-'A'+1;
int ans = 0;
int n = s.size();
for(int i=0; i<n; i++){
ans = ans*26 + (s[i]-'A'+1); // 别忘了加括号
}
return ans;
}
};