给定一个数,求出在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; } };