前言:内容包括:题目,代码实现,大致思路,代码解读,26进制数字转对应字母 与 字母转对应26进制数字的方法总结
给你一个字符串 columnTitle ,表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。
例如:
A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28
...
示例 1:
输入: columnTitle = "A"
输出: 1
示例 2:
输入: columnTitle = "AB"
输出: 28
示例 3:
输入: columnTitle = "ZY"
输出: 701
提示:
1 <= columnTitle.length <= 7
columnTitle 仅由大写英文组成
columnTitle 在范围 ["A", "FXSHRXW"] 内
int titleToNumber(char * columnTitle)
{
int len = strlen(columnTitle);
int arr[7] = { 0 };
int i = 0;
for (i = len - 1; i >= 0; i--)
{
arr[i] = columnTitle[i] - 'A' + 1;
}
int sum = 0;
for (i = 0; i < len; i++)
{
sum += pow(26, len - 1 - i) * arr[i];
}
return sum;
}
正常的26进制:0~25
转成对应字母:A~Z (0~25的每个数字转成其对应的字母:此数字+'A')
比如:0---->A (0+A = A 因为A的ASCII码值是65,0+65 = 65)
1----->B (1+A = B 因为B的ASCII码值是66,1+65 = 66)
A~Z转成对应的26进制的数字(0~25):此字母-'A'
比如 A---->0 (A-A = 0)
B--->1 (B-A = 1)
1 从后往前遍历这个字符串,将每个字符转成对应的26进制的数字(0~25之间的数字)
但是题目是在原有的进制基础上,使得每一位数字+1,比如:
0----->1 1---->2
所以我们得到26进制的数字后,需要再对其+1,就能得到符合题意设定的数字
然后将其存入arr数组中
字母-'A' = 对应的26进制数字(0~25之间的数字)
2 遍历arr数组,模仿26进制数字的计算方法:
需要使用幂函数pow得到26的幂次方
int len = strlen(columnTitle);
int arr[7] = { 0 };//存放每一个字母转成的符合题意要求的数字
int i = 0;
for (i = len - 1; i >= 0; i--)
{
arr[i] = columnTitle[i] - 'A' + 1;
}
遍历整个字符串,每得到一个字母,将其转成符合题意要求的对应数字:
比如:AB
得到B:B对应的26进制的数字是1(B-A = 1)
但是在题目中,B要对应2,所以1还需+1,变成2
得到A:A对应的26进制的数字是0(A-A = 0)
但是在题目中,A要对应1,所以0还需+1,变成1
int sum = 0;
for (i = 0; i < len; i++)
{
sum += pow(26, len - 1 - i) * arr[i];
}
return sum;
遍历arr数组:arr数组中存放的是1,2
A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ...
输入:A 得到1
输入:AB 得到28
1 将每一个字母转成对应的26进制数字(0~25):字母-'A'
2 将由1得到的数字再+1 即可得到符合上述规律的对应数字
比如:A--->0(A-A) --->1(0+1)
B--->1 (B-A)--->2(1+1)
A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ...
输入:1 得到 A
输入:28 得到 AB
1 在得到此数的每一位之前,此数都需要-1,这样得到的每一位就是26进制的数字(0~25)
2 将由1得到的26进制的数字+'A' 即可得到对应的字母
比如:28
28-1 = 27:得到最低位的数字:27%26 = 1
转成对应字母: 1+A = B
27/=26 = 1:去掉最低位
1 - 1 = 0:得到一位数字:0%26 = 0
转成对应字母:0+A = A
结果:AB