171. Excel表列序号
题目叙述
给你一个字符串 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
模式识别
本题本质上是一个进制转换问题,可将其看作是 26 进制数转换为 10 进制数。因为 Excel 表列名称由字母 A - Z 组成,每个字母对应一个数字 1 - 26,这类似于 26 进制的表示。
考点分析
- 进制转换原理:理解如何将 26 进制数转换为 10 进制数,需要掌握进制转换的基本公式。
- 字符串处理:对输入的字符串进行遍历和字符处理,将每个字符转换为对应的数字。
所有解法
- 迭代法:从字符串的首位开始,依次取出每个字符,将其转换为对应的数字,然后根据进制转换公式逐步计算出最终的序号。
- 递归法:可以使用递归的方式来处理字符串,将问题分解为子问题进行求解。
最优解法(迭代法)的 C 语言代码
#include <stdio.h>
#include <string.h>
// 函数用于将 Excel 表列名称转换为对应的列序号
// 参数 columnTitle:输入的 Excel 表列名称字符串
// 返回值:该列名称对应的列序号
int titleToNumber(char * columnTitle) {
int result = 0; // 用于存储最终的列序号,初始化为 0
int len = strlen(columnTitle); // 获取输入字符串的长度
// 遍历字符串中的每个字符
for (int i = 0; i < len; i++) {
// 将当前字符转换为对应的数字,A 对应 1,B 对应 2,以此类推
int digit = columnTitle[i] - 'A' + 1;
// 根据进制转换公式更新结果
// 类似于 10 进制中,从高位到低位计算数值,这里是 26 进制
result = result * 26 + digit;
}
return result; // 返回最终的列序号
}
复杂度分析
- 时间复杂度:代码中对输入的字符串进行了一次遍历,因此时间复杂度为 O(n)O(n)O(n),其中 nnn 是字符串
columnTitle的长度。 - 空间复杂度:只使用了常数级的额外空间,因此空间复杂度为 O(1)O(1)O(1)。
综上所述,该解法通过迭代的方式,按照 26 进制转换为 10 进制的原理,高效地计算出 Excel 表列名称对应的列序号,并且具有较好的时间和空间复杂度。
354

被折叠的 条评论
为什么被折叠?



