我不知道你看到这一道题目有什么感觉,我先告诉你我有什么感觉,在此之前我再给你写一组有相同模式的数字。
你先告诉我你有什么感觉,有没有感觉,没有感觉的话,那我们就来更深的了解一下:
我们分析最后一个,因为这些模式都是一样的。
可以看出
这一组数字中字符集为
{
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
}
\{1, 2, 3, 4, 5, 6, 7, 8, 9\}
{1,2,3,4,5,6,7,8,9}
我们将字符集换成
{
0
,
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
}
\{0, 1, 2, 3, 4, 5, 6, 7, 8\}
{0,1,2,3,4,5,6,7,8}则上图可以转化为:
我们再将->右边的值统一减1看看变成什么:
现在你有没有感觉,这是什么?是不是9进制,也就是说这一组中字符集为
{
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
}
\{1, 2, 3, 4, 5, 6, 7, 8, 9\}
{1,2,3,4,5,6,7,8,9}构造出来的数字等价于9进制系统。
同理我们也可以分析得到由字符集
{
A
,
B
,
C
.
.
.
.
.
.
Z
}
\{A,B,C......Z\}
{A,B,C......Z}构造出来的系统等价于26进制系统。如此一来就转化为了如何将数字按照进制数字转化得到每一位了。
根据上面的思路,我们可以写出下述代码:
char* convertToTitle(int columnNumber) {
char * answer = (char *)malloc(sizeof(char)*20);
int length = 0;
while((columnNumber!=0)){
columnNumber -= 1; //是为了从0开始进行对应.
answer[length] = columnNumber%26+'A';
length ++;
columnNumber/=26;
}
if(!length){
answer[length++] = 'A';
}
answer[length] = '\0';
for(int i=0; i<length/2;i++){
char t = answer[i];
answer[i] = answer[length-i-1];
answer[length-i-1] = t;
}
return answer;
}
运行结果截图: