【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/

posted @ 2020-07-14 21:51  Flix  阅读(232)  评论(0编辑  收藏  举报