这是我参与11月更文挑战的第27天,活动详情查看:2021最后一次更文挑战
题目描述
给你一个整数 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"
提示:
1 <= columnNumber <= 231 - 1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/excel-sheet-column-title
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
复制代码
思路 & CODE
1. 26进制运算
第一次遇到这种进制题目,非常神奇
取模和除法运算
[A-Z]对应[1-26],范围相当于是1*26^0 ~ 26 * 26 ^ 0
[AA-ZZ]对应[27-702],范围相当于是26*26^0 + 0*26^1 ~ 26*26^0 + 26*26^1
一个26进制数可以表示为:
a1 * 26^0 + a2 * 26^1 + a3 * 26^2 + ... = n
复制代码
如果对两边进行取模运算,那么结果就是
n = a1
复制代码
如果对两边进行除法计算,结果就是:
a2 * 26^0 + a3 * 26^1 + ... = n
复制代码
相当于把这个26进制数往右移一位
本题中只需要不断的取模、除法运算,直到n变为0,就可以得出结果,每次取模得到的结果可以和'A'相加进行位运算,得到相应的字符
特殊处理:减一操作
可以看到题目的数字是从1开始的,那么26个字母的范围就是[1-26],但是26进制的范围是[0-25],我们要避免这种情况,就必须在每次循环的时候把数字减去一。
- 例子
传入一个数字16,减去一,进行取模运算15 % 26 = 15,接下来进行位运算(char) (15 + 'A'),结果为P,而p对应的数字为16,这里我们加上A这个字符,相当于是给数字又加上了一
public String convertToTitle(int columnNumber) {
StringBuilder res = new StringBuilder();
while (columnNumber > 0) {
columnNumber--;
int mod = columnNumber % 26;
res.append((char) (mod + 'A'));
columnNumber /= 26;
}
return res.reverse().toString();
}
复制代码




近期评论