leetcode算法168. Excel表列名称

113 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情

一、题目描述:

168. Excel表列名称 - 力扣(LeetCode)

给你一个整数 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

二、思路分析:

如果对应的话,A在最高位的时候像1,但不在最高位的时候又有点像0.
一位,A-Z,26个。
二位,AA-ZZ,26×\times26个。
形式上第一个三位数AAA实际上是26+26×\times26+1,跟n进制的n^2不同。
然而这个超出进制的现象仅仅在最高的首位才会出现,且仅仅是与位数有关但与该位的值无关的偏移,一旦它不是最高位,在叠加的时候又相当于普通的26进制。
给出CCCCC
那么按照前面的解释可以认为
最高的首位C代表3×26×26×26×26+(26×26×26+26×26+26+1)3\times26\times26\times26\times26+(26\times26\times26+26\times26+26+1)
后面代表的数减一但进制照常。
第二位的C看作2×26×26×262\times26\times26\times26
第三位的C看作2×26×262\times26\times26
第四位的C看作2×262\times26
第五位的C看作2×12\times1
最高位的超出进制部分实际上可以跟后面几位合并起来,也就不需要把后面几位减一了。

也就是说,仍然可以看作26进制,A就视作1,B就视作2......Z是把本该进位的数写成了不进位的假形式。

也就是说ZA=26\times26+1其实就是真正的三位数假写成两位。

三、AC 代码:

class Solution {
public:
    string convertToTitle(int n) {
        string ans;
        while(n){
            int b=n%26;n/=26;
            char c=b+'A'-1;
            if(b==0){
                c='Z';
                n--;
            }
            ans=c+ans;
        }
        return ans;
    }
};

参考

想不明白为什么这么简单的题目有那么多复杂的解法,来个简单的! - Excel表列名称 - 力扣(LeetCode)