1. 程式人生 > 實用技巧 >【LeetCode-數學】Excel表列序號

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

參考

https://leetcode-cn.com/problems/reverse-bits/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-4-9/