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;

    }

};

 

你可能感兴趣的:(LeetCode)