题目描述
给定一个正整数,返回它在 Excel 表中相对应的列名称。
例如,
1 -> A
2 -> B
3 -> C
...
26 -> Z
27 -> AA
28 -> AB
...
样例
输入: 1
输出: "A"
输入: 28
输出: "AB"
输入: 701
输出: "ZY"
算法分析
- 1、对于某个数都满足$x = a_{0} * 26^k + a_{1} * 26^{k - 1} + … + a_{k} * 26^0$,因此可以先对整个 $x mod 26$ 求出 $a_{k}$,再让
x /= 26
,再让 $x mod 26$ 求 $a_{k - 1}$ ..... 直到求出 $a_{0}$ 的方式求出所有的系数,则可以找出所有对应的字母 - 2、可是由于
Excel
表列的特殊性,Excel
取值范围为[1, 26]
,因此不能直接用上面1的方法进行求解,逐个获取到26
进制 逻辑上的 个位、十位、百位…,将26
进制 逻辑上的 个位、十位、百位…均减1
映射到[0, 25]
即可,最后转换为字符 - 3、当计算到当前位对应的字母时,则让
n --
,n % 26
则可以计算出当前位在[0, 25]
哪个位置,再通过+ 'A'
的方式将字母偏移回去,再让n /= 26
拿到商,为下一位做准备,又由于每个位都需要进行减1
映射操作,因此此时的n
不做任何变化
时间复杂度 $O(n)$
Java 代码
class Solution {
public String convertToTitle(int n) {
StringBuffer sb = new StringBuffer("");
while(n > 0)
{
n --;
sb.append((char)(n % 26 + 'A'));
n /= 26;
}
return sb.reverse().toString();
}
}
ak的范围不就是[0,25]吗,为什么还要减去1 ,映射到[0,25]呀,不是很懂
很机智
老哥强
老哥简洁,学习了
冲