携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情
1.描述
168. Excel表列名称 - 力扣(LeetCode) (leetcode-cn.com)
给你一个整数 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 <= 2^31 - 1
2.分析
26进制,但0代表是最大的数,此时需要处理。其他的处理步骤与10进制一致。
打麻将每次摇骰子,发现伙伴算得好快。计算机是0开始,而生活都是1开始。
后来我取模为0时就当4,是最后一家,最大值。如果是计算机编程就是自家,最小值。
后来发现有更狠的伙伴,人家打麻将有顺口溜。。。直接出结果!
需要数学公式的看官方题解,说得没官方好。
701 = Z(26) * 26^1 + Y(25) * 26^0
// 减去取模后的数a,必然是26 int a = columnNumber % 26; // 减去取模后的数 columnNumber = columnNumber - a; // 必然是26的倍数 columnNumber = columnNumber / 26;
3.AC代码
class Solution {
public String convertToTitle(int columnNumber) {
StringBuffer stringBuffer = new StringBuffer();
while (columnNumber > 0) {
int a = columnNumber % 26;
if (a == 0) {
a = 26;
}
columnNumber -= a;
columnNumber /= 26;
stringBuffer.insert(0, (char) ('A' + a - 1));
}
return stringBuffer.toString();
}
}
4.总结
这道题目,很自然的想法就是,我们要将数字转化为字母,就需要就将数据对26取模,再转化为对应字母的ascii码。
但是这里需要注意的是我们1-26对26取余后的结果是1-25与0,此时转化为A-Z时则会出现了循环错位,要么分类讨论,要么就寻找更好的方法。
而当我们对数据一律减1后取余,使得1-26减1后取余后的结果0-25再+'A',就可以与A-Z对应!
参考
【仗剑骑士】C++, 进制转换,速度超过100%的用户+168. Excel表列名称 - Excel表列名称 - 力扣(LeetCode)