题目描述
给定一个正整数,返回它在 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。由列名X1X2…XkXk+1转换成的十进制数可表示为
X1*26k + X2*26k-1 + …… + Xk*26 + Xk+1
可知去掉最低位的数字Xk+1后一定能被26整除,而Xk+1可以取1~26中的数,为了从要转换的数字n中分离出最后一位,所以先把n减1,这样Xk+1的取值变为0~25,让n对26取余后得到的余数即为此时Xk+1对应的数,然后再令A~Z依次匹配0~25即可。最后一位确定后,令n=(n-1)/26,这样得到结果列名依次右移一位的新列名对应的十进制数
X1*26k-1 + X2*26k-2 + …… + Xk
再对其递归求解,直到十进制数变为0。
代码
1 class Solution { 2 public: 3 string convertToTitle(int n) { 4 string res = ""; 5 while(n){ 6 res = (char)('A' + (n - 1) % 26) + res; 7 n = (n - 1) / 26; 8 } 9 return res; 10 } 11 };