题目链接:https://leetcode.cn/problems/excel-sheet-column-title/
思路如下:
十进制转 26 26 26 进制: n = a k ∗ 2 6 k + a k − 1 ∗ 2 6 k − 1 + … + a 1 ∗ 2 6 1 + a 0 ∗ 2 6 0 n = a_{k} ∗ 26^{k} + a_{k-1} ∗ 26^{k−1} + … + a_{1} ∗ 26^{1} + a_{0} ∗ 26^{0} n=ak∗26k+ak−1∗26k−1+…+a1∗261+a0∗260
对于某个数
n
n
n,先让 n % 26
求出
a
0
a_{0}
a0,再让 n /= 26
;然后让 n % 26
求出
a
1
a_{1}
a1,再让 n /= 26
……,求出所有的系数,则可以找出所有对应的字母。
class Solution {
public:
string convertToTitle(int columnNumber) {
string res;
while (columnNumber) {
res += char(columnNumber % 26 + 'A');
columnNumber /= 26;
}
reverse(res.begin(), res.end());
return res;
}
};
然而,上面代码是错误的,因为上面代码是把 26 26 26 进制的 [ 0 , 25 ] [0,25] [0,25] 对应成字母 [ A , Z ] [A,Z] [A,Z],但在本题中,Excel表列的 [ 1 , 26 ] [1,26] [1,26] 对应字母 [ A , Z ] [A,Z] [A,Z],因此不能直接使用十进制转 26 26 26 进制的方法进行求解。
本题是从 1 1 1 开始的,我们可以在执行进制转换操作前,先对 n n n 执行减 1 1 1 操作,从而实现整体偏移到从 0 0 0 开始。
C++代码如下:
class Solution {
public:
string convertToTitle(int columnNumber) {
string res;
while (columnNumber) {
columnNumber--;
res += char(columnNumber % 26 + 'A');
columnNumber /= 26;
}
reverse(res.begin(), res.end());
return res;
}
};