题目链接:
题目描述:
Give a positive integer, return its corresponding column title as
appear in an Excel sheet.
For example :
1 -> A 2 -> B 3 -> C ... 26 -> Z 27 -> AA 28 -> AB
解题方案:
这个题目是跟%%相似的一道题,上面那道是将字符串转换为数字,
现在则是将数字转换为字符串。
在这里我们还是采用进制转换的思想,讲一个十进制
的数字转换为26进制的字符串,这跟十进制转二进制
是类似的,无非现在取模的是取26的摸,除26。
采用"除26取余,逆序排列"法。具体做法是:用26整
除十进制整数,可以得到一个商和余数;再用26去除
商,又会得到一个商和余数,如此进行,直到商为0时
为止,然后把先得到的余数作为二进制数的低位有效位,
后得到的余数作为二进制数的高位有效位,依次排列
起来。
这里需要注意三点:
(一).取得的余数要转换为相应的字符,比如A代表1,B代
表2...Z代表26等等。
(二).习惯上我们是从0开始计数,用0~25表示一个轮回,
每次加到26的时候才往前进位,且进位以后原来位为0.
然而这个题目将A看做是1,那么这就从1开始计数了,
即1~26,每次加到27的时候才进位,且进位后原来位为1.
所以在这里我们为了统一就对每次除完26的整数进行减
1操作,这样我们就把1~26转化为0~25了。
(三).最后我们还需要翻转一些字符串,因为我们得到的结
果是逆序的。
源码:
char *convertToTitle(int n) {
//动态声明一维数组
char *s;
s = (char *)malloc(40);
//初始化字符数组
for (int i = 0; i < 40; i++)
{
s[i] = '\0';
}
//将数字转换为字符串
int location = 0;//指示字符串的位置
while (n)
{
s[location++] = (n - 1) % 26 + 'A';
n--;//因为他
n /= 26;
}
//printf("%d\n", location);
//反转字符串
for (int i = 0, j = location - 1; i < location / 2; i++, j--)
{
char temp;
temp = s[i];
s[i] = s[j];
s[j] = temp;
}
return s;
}