168. Excel表列名称

举报
陈沧夜 发表于 2022/04/29 22:55:12 2022/04/29
【摘要】 文章目录 来源题目内容思路代码 来源 力扣(LeetCode) 题目内容 给定一个正整数,返回它在 Excel 表中相对应的列名称。 例如, 1 -> A 2 ->...

来源

力扣(LeetCode)

题目内容

给定一个正整数,返回它在 Excel 表中相对应的列名称。

例如,

1 -> A
2 -> B
3 -> C
...
26 -> Z
27 -> AA
28 -> AB 
...

示例 1:

输入: 1
输出: A

示例 2:

输入: 28
输出: AB

示例 3:

输入: 701
输出: ZY

思路

这一题,本来以为使用进制转换可以快速做出来。然而在做的时候发现还是太天真了。

因此带来的经验教训是,不要眼高手低

这个字母26进制与一般的进制是不同的。

以下是推导过程:

对于进制转换,我们有:

a i a_i ai 为从右往左每一位上的数字,则:
n u m b e r = ∑ i = 0 n − 1 a i ∗ 2 6 i number = \sum_{i=0}^{n-1}a_i * 26^{i} number=i=0n1ai26i
我们把 a 0 a_0 a0 先提出来:
n u m b e r = a 0 + ∑ i = 1 n − 1 a i ∗ 2 6 i number = a_0 + \sum_{i=1}^{n-1}a_i * 26^{i} number=a0+i=1n1ai26i
再变形得:
n u m b e r = a 0 + 26 ∗ ∑ i = 1 n − 1 a i ∗ 2 6 i − 1 number = a_0 +26 * \sum_{i=1}^{n-1}a_i * 26^{i-1} number=a0+26i=1n1ai26i1

两边同时减1
n u m b e r − 1 = ( a 0 − 1 ) + 26 ∗ ∑ i = 1 n − 1 a i ∗ 2 6 i − 1 number -1 = (a_0 - 1) +26 * \sum_{i=1}^{n-1}a_i * 26^{i-1} number1=(a01)+26i=1n1ai26i1
由上面的式子我们可以很容易看到:

a 0 − 1 a_0 - 1 a01 n u m b e r − 1 number - 1 number1 除以 26 26 26 的余数。

这样 a 0 − 1 a_0 - 1 a01 的值我们就求出来了

接下来是更新后的number

不妨把更新后的number值设为number'

那么:
n u m b e r ′ = ( ( n u m b e r − 1 ) − ( a 0 − 1 ) ) / 26 = ∑ i = 1 n − 1 a i ∗ 2 6 i − 1 number' = ((number - 1) - (a_0 - 1)) / 26 = \sum_{i=1}^{n-1}a_i * 26^{i-1} number=((number1)(a01))/26=i=1n1ai26i1
这样就回到了最初的 n u m b e r = ∑ i = 0 n − 1 a i ∗ 2 6 i number = \sum_{i=0}^{n-1}a_i * 26^{i} number=i=0n1ai26i

因此代码的思路就很快能够写出来。

代码

class Solution {
public:
    unordered_map<int,char> chara={
        {1,'A'},
        {2,'B'},
        {3,'C'},
        {4,'D'},
        {5,'E'},
        {6,'F'},
        {7,'G'},
        {8,'H'},
        {9,'I'},
        {10,'J'},
        {11,'K'},
        {12,'L'},
        {13,'M'},
        {14,'N'},
        {15,'O'},
        {16,'P'},
        {17,'Q'},
        {18,'R'},
        {19,'S'},
        {20,'T'},
        {21,'U'},
        {22,'V'},
        {23,'W'},
        {24,'X'},
        {25,'Y'},
        {26,'Z'},
    };
    string convertToTitle(int columnNumber) {
        string ans;
        int a;
        while(columnNumber!=0){
            a = (columnNumber-1) % 26 + 1;
            columnNumber = (columnNumber -a) / 26;
            ans = ans + chara[a];

        }
        reverse(ans.begin(),ans.end());
        return ans;
    }
};

文章来源: blog.csdn.net,作者:沧夜2021,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/CANGYE0504/article/details/118332459

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。