给你一个整数 columnNumber ,返回它在 Excel 表中相对应的列名称。
例如:
A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ...
示例 1:
输入:columnNumber = 1 输出:"A"
示例 2:
输入:columnNumber = 28 输出:"AB"
示例 3:
输入:columnNumber = 701 输出:"ZY"
示例 4:
输入:columnNumber = 2147483647 输出:"FXSHRXW"
解法一
这道题的话本质上其实就是进制转换,把 10 进制转为 26 进制表示,可以看一下 这篇文章 对进制转换有个更深的了解。
先讨论一下我们熟悉的 10 进制和 16 进制的转换。
16 进制中,0 到 9 还是正常的数字,然后增加字母 A 表示 10,字母 B 表示 11... 以此类推,直到 F 表示 15,所以我们各个位的取值范围是 0 - 15 。
假如 16 的进制的 A1F 转换为 10 进制的话就用下边的式子,其中 A 表示 10, F 表示 15。
10×162+1×161+15×160=259110×162+1×161+15×160=2591
对于 10 进制转 26 进制的话是一样的道理,只不过每次采用模 26 和除以 26。
所以代码的话,可以直接写出来。
public String convertToTitle(int n) {
StringBuilder sb = new StringBuilder();
while (n > 0) {
int c = n % 26;
sb.insert(0, (char) ('A' + c - 1));
n /= 26;
}
return sb.toString();
}
上边 (char) ('A' + c - 1) 这里的话,算是一个技巧,我们是通过对 A 的偏移,强制将整数转为了字符。
比如 c = 3,那么 'A' + c - 1,会把 A 根据 ASCII 码值转为 65,然后计算 65 + c - 1 = 65 + 3 - 1 = 67,然后 (char)67,根据 ASCII 码值就刚好是字符 C。
但是上边的算法还是有问题的,因为题目中每个位的范围是 1-26,而不是0-25。
所以取余的话对于 1-25 的数字结果都是正确的,但如果当前的位是 26,余数求出来就是 0,此时我们需要把它修正为 26。
代码修正后如下。
public String convertToTitle(int n) {
StringBuilder sb = new StringBuilder();
while (n > 0) {
int c = n % 26;
if(c == 0){
c = 26;
n -= 1;
}
sb.insert(0, (char) ('A' + c - 1));
n /= 26;
}
return sb.toString();
}
文章介绍了如何将给定的整数转换为Excel列名称,通过10进制转26进制,利用ASCII码和取余技巧,并修正了当余数为0时的处理方法。
1755

被折叠的 条评论
为什么被折叠?



