【LeetCode-數學】Excel表列序號
阿新 • • 發佈:2020-07-14
題目描述
給定一個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;
}
};