LC

Excel表列名称
Excel表列数字

思路

收录这两道题主要是因为里面有一些细节如果没考虑好很容易错。首先大思路是考虑26进制转换,但是直接做会发现下标很难一一对应。

  1. 首先下标从1开始,这个很好解决,全部向前挪一位即可;
  2. 其次是进位,比如Z-AA,换成26进制就是0 25-0 0,但是按照正常进位,应该是1 0,所以直接做在进位这里不好处理。

解决方法是按位数来做,因为当位数确定时(也就是不考虑进位),26进制是work的。

Q1 代码

class Solution {
public:
    string convertToTitle(int n) {
        int k = 1;
        for(long long p = 26; n > p; p = p * 26) { // 算出位数,n最后表示在k位数中的第几个
            n -= p;
            k++;
        }

        n--; // 下标从0开始
        string res;
        while(k--) {  // 26进制转换
            res += n % 26 + 'A';
            n /= 26;
        }
        reverse(res.begin(), res.end());
        if(res[0] == '0') return "0";
        return res;
    }
};

Q2 代码

class Solution {
public:
    int titleToNumber(string s) {
        int n = s.size();
        int bias = 0;
        for(int i = 0; i < n; i++) {
            bias = bias * 26 + s[i] - 'A';  // 先求出n位数下是第几个数
        }

        int base = 0;
        for(long long i = 0, p = 26; i < n - 1; i++) { // 然后求出n位数之前一共有多少数
            base += p;
            p *= 26;
        }

        return base + bias + 1; // 下标从1开始
    }
};