LeetCode#168. Excel表列名称

105 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情

一、题目描述:

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

二、思路分析:

对于这道题,我的第一印象是用模运算和除法运算,求结果,我只是自己算了几个数得到的这个结论,其本质问题没弄清楚,所以导致这道题我一直解不出来。

要想彻底弄明白,首先可以先理解一些10进制转16进制的问题。 例如把22转化为16进制则为16。来看一些解题过程:

X3pow(16,2)+X2pow(16,1)+X1pow(16,0)=22

这个等式,可以通过对16取模,得到X1的值。0+0+X1=6 -->X1=6 ->这部对应了取模的运算

将X1带回去,得到:X3pow(16,2)+X2pow(16,1)+6=22 -->X3pow(16,2)+X2*pow(16,1)=16

为求X2的值(X2的系数为16),需要把上面得到的是等式同时整除16,得到:

X3pow(16,1)+X2pow(16,0)=1 -->X316+X2=1

对于这个等式,可以通过两边对16取模,X2=1;

把X2=1带回去。得到X316+1=1--> X3=0(这部注意,其实X3之前还可以有好多参数,但是为了表示方便就没写)

X3==0也是计算终止的标志。

所以最后求得22的16进制为:16。 ---------------------------上面是10进制转16进制---------------------------- 那么对于26进制其实也是一样的,但是注意这道题A-Z的表示没有0,所以,遇到0的话要把0加上26。 以求52的表达形式为例(其他的非特殊情况和正常进制转换一样)

X3pow(26,2)+X2pow(26,1)+X1=52;

首先求X1的值,两边对26取模。X1=0, 这里就要注意了因为不存在0的表示(这是这道题和普通进制的区别,普通进制满进位就用0表示,而这道题满进位用26表示),所以这里我们强制把X1+26,这样X1=26。

把X1=26带回去, X3pow(26,2)+X2pow(26,1)+26=52 -->X3pow(26,2)+X2pow(26,1)=26;

X3pow(26,2)+X2pow(26,1)=26; 可以根据这个等式求X2的值。

两边除以26,令X2的系数为1。 X3pow(26,1)+X2=1 -->X2=1;

把X2=1带回去。 X316+1=1-->X3=0;

所以最后52可以表示为AZ。

三、AC 代码:

class Solution {
public:
    string convertToTitle(int n) {
        string res;
        while(n>0)
        {
            int tmp=n%26;//取得每一位的值
            if(tmp==0)//0用26代替
                tmp=26;
            n=n-tmp;//n=n-tmp,对应了每次求得值后向原表达式回带的过程。
            res.insert(0,1,'A'+tmp-1);
            n=n/26;
        }
        return res;
    }
};