题目描述
给定一个正整数,返回它在 Excel 表中相对应的列名称。
例如,
1 -> A
2 -> B
3 -> C
...
26 -> Z
27 -> AA
28 -> AB
...
示例 1:
输入: 1
输出: "A"
示例 2:
输入: 28
输出: "AB"
示例 3:
输入: 701
输出: "ZY"
解题思路
此题可看做把一个10进制的数转换成26进制的列名,但由于列名称里没有字母表示十进制的0,所以和单纯的进制转换又不太一样。考虑由最低位开始从右往左来依次求解,最低位的数字范围是1~26,分别对应列名中的A~Z。由列名XX…XX转换成的十进制数可表示为
X*26 + X*26 + …… + X*26 + X
可知去掉最低位的数字X后一定能被26整除,而X可以取1~26中的数,为了从要转换的数字n中分离出最后一位,所以先把n减1,这样X的取值变为0~25,让n对26取余后得到的余数即为此时X对应的数,然后再令A~Z依次匹配0~25即可。最后一位确定后,令n=(n-1)/26,这样得到结果列名依次右移一位的新列名对应的十进制数
X*26 + X*26 + …… + X
再对其递归求解,直到十进制数变为0。
代码
class Solution {
public:
string convertToTitle(int n) {
string res = "";
while(n){
res = (char)('A' + (n - ) % ) + res;
n = (n - ) / ;
}
return res;
}
};