每天 3 分钟,走上算法的逆袭之路。
前文合集
代码仓库
GitHub: https://github.com/meteor1993/LeetCode
Gitee: https://gitee.com/inwsy/LeetCode
题目:Excle 表列名称
题目来源:https://leetcode-cn.com/problems/excel-sheet-column-title/
给定一个正整数,返回它在 Excel 表中相对应的列名称。
例如,
1 -> A
2 -> B
3 -> C
...
26 -> Z
27 -> AA
28 -> AB
...
示例 1:
输入: 1
输出: "A"
示例 2:
输入: 28
输出: "AB"
示例 3:
输入: 701
输出: "ZY"
解题思路
这道题读完一遍完全不知道是让算什么东西,但是我如果把解题的思路讲出来,我相信有一半的小伙伴都会做。
我如果再举两个例子,我相信超过 90% 的小伙伴都会做。
嗯,我就是那个不看答案不会做一看答案就懂的人。
这道题实际上是在求一个十进制数对应的 26 进制的结果是什么,如果把 Excel 的列名命名规则理解成是一个 26 进制。
现在明白是在求什么了,那么 10 进制转其他进制怎么转。
先看个最简单的例子, 10 进制转 10 进制。
我们用 123 举例子:
123 / 10^0 % 10 = 3
123 / 10^1 % 10 = 2
123 / 10^2 % 10 = 1
然后我们把结果逆序输出得到了 123 。
如果是转 2 进制呢?
123 / 2^0 % 2 = 1
123 / 2^1 % 2 = 1
123 / 2^2 % 2 = 0
123 / 2^3 % 2 = 1
123 / 2^4 % 2 = 1
123 / 2^5 % 2 = 1
123 / 2^6 % 2 = 1
把结果逆序输出后得到的是 1111011 。
那么转 26 进制怎么转实际上已经有结果了。
123 / 26^0 % 26 = 19
123 / 26^1 % 26 = 4
对应到这道题里的结果就是 A + 4
和 A + 19
得到的 ASCII 值转成字母再逆序输出,得到的结果是 ET
。
public String convertToTitle(int n) {
StringBuilder sb = new StringBuilder();
while (n != 0) {
n--;
sb.append((char) ('A' + n % 26));
n /= 26;
}
return sb.reverse().toString();
}
注意这里有一个 n--
,因为正常的 26 进制是从 0 ~ 25 的,是没有最高位 26 的,但是这道题的范围是 1 ~ 26 ,所以每次计算的时候需要将 n 减去 1 。