• leetcode[168] Excel Sheet Column Title


     给定一个数,求出在excel中的列标题。例如 1 对应 A,2 对应 B,. .. , 26对应Z, 27 对应AA

    在没看别人解法之前,我是这样做的:

    观察数学规律,每次求一个字母,假设只有AB的情况的话,应该是这样的:我们列举前面3大种

    A,B,AA,AB,BA,BB,AAA,AAB,ABA,ABB,BAA,BAB,BBA,BBB

    第一种只有一个字母的是两个,如果是26个字母就26个了

    第二中有两个字母,有4个,也就是第一种的平方,如果是26个字母就是26的平方

    第三种有三个字母,有8个,也就是第一种的立方,如果是26个字母就是26的立方

    依次类推。。。

    那么我们可以假设基数为base,基数的次幂power,base的power次幂就记作pow(base,power)

    我们一位一位的判断,判断每一位的时候是对该位可能的数取余,然后在除以前一次的总可能数,根据结果判断给当前位值。

    例如我们举个AAB的例子,AAB对应的数是8,先要求第一位,那就是8对第一种的可能数取余,8%2==0,余数为零的时候我们另外判断,因为余数为零就是都了基数值了,也就是对应字母最后一个,因为我们只假设有两个字母,所以余数为零的时候为B,如果26个字母,那就是Z了。

    接下去求第二位,要减去上一种的可能数2,  8-2==6,6再对当前的可能数取余数  6%4==2,这个时候2对应AB,我们怎么取出我们想要的A呢,只要减去1 再除以2就行了,因为是根据第一个字母A或者B可以把第二种分为两组。减去1再除以2的话就可以把AB分开。

    同理可以求其他位数的。

    代码如下:

    class Solution {
    public:
        string convertToTitle(int n) 
        {
            string str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            string ans = "";
            int value = n, base = 26, power = 1;
    
            while(value > 0)
            {
                if (value % (int)pow(base, power) == 0)
                    ans = 'Z' + ans;
                else
                    ans = str[(value % (int)pow(base, power) - 1) / (int)pow(base, power - 1)] + ans;
                value -= (int)pow(base, power);
                power++;
            }
            return ans;
        }
    };

    AC了之后想知道别人是不是这样做。发现比我的简单啊。

    其实就是进制问题。我一开始其实差点就有想到的。可是不知怎么的就想到去找数学规律了。

    这位

    • 典型的进制转换,但注意n的开始范围,因为对26取模的范围是0-25,我统一把n–,目的是0-25对应A-Z
    class Solution {
    public:
        string convertToTitle(int n) {
            string res="";
            n--;
            while(n>=0)
            {
                res.insert(0,1,n%26+'A');
                n /= 26;
                n--;
            }
            return res;
        }
    };

    其实可以更简单写成:

    class Solution {
    public:
        string convertToTitle(int n) {
            string res="";
            while(n>0)
            {
                n--;
                res.insert(0,1,n%26+'A');
                n /= 26;
            }
            return res;
        }
    };
  • 相关阅读:
    使用FormatterServices 类序列化或反序列化
    HaozesFx(飞信精灵)发布
    EF Provider for Access/ODBC 以及ADO.Net Entity Framework 与Linq to SQL的比较和适用场景:
    Fetion2008 分析 Part3:会话
    Gleaner(个人文档管理)
    This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms.
    发一个收取Pop3邮件的代码
    码农架构技术周刊 | 第1期
    这样学Redis,才能技高一筹!
    CommunityServer2.1删除anonymous帐号后的解决办法
  • 原文地址:https://www.cnblogs.com/higerzhang/p/4179283.html
Copyright © 2020-2023  润新知