思路
收录这两道题主要是因为里面有一些细节如果没考虑好很容易错。首先大思路是考虑26进制转换,但是直接做会发现下标很难一一对应。
- 首先下标从1开始,这个很好解决,全部向前挪一位即可;
- 其次是进位,比如
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开始
}
};
- Post link: https://scnujackychen.github.io/2021/03/23/LC-168/
- Copyright Notice: All articles in this blog are licensed under unless otherwise stated.
若没有本文 Issue,您可以使用 Comment 模版新建。
GitHub IssuesGitHub Discussions