网站首页 > 技术文章 正文
题目要求
给出一个字符串 str ,表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。
示例 1: 输入: str = "A" 输出: 1
示例 2: 输入: str = "AB" 输出: 28
设计说明
该问题要求将Excel列名称转换为对应的列序号,其本质是将一种特殊形式的26进制数(无0值,A-Z对应1-26)转换为十进制数。通过逐位遍历字符串并累加计算,可高效实现转换。
解决代码
int titleToNumber(char* columnTitle) {
int result = 0;
for (int i = 0; columnTitle[i] != '\0'; ++i) {
result = result * 26 + (columnTitle[i] - 'A' + 1); // 核心转换逻辑
}
return result;
}
算法讲解
1. 核心思想
- 进制转换增强版:将Excel列名视为一种 无0的26进制数(A=1, B=2, ..., Z=26),按权重展开求和。
- 逐位累加:从左到右遍历字符,每一步将当前结果乘以26(模拟进制位权),加上当前字符的数值。
2. 关键步骤
- 初始化:结果变量 result 初始化为0。
- 遍历字符:
- 对每个字符计算其值:字符 - 'A' + 1(如 B → 2)。
- 更新结果:result = result * 26 + 当前字符值。
- 返回结果:遍历结束后,result 即为最终列序号。
3. 示例解析
以输入 "ZY" 为例:
- Z 对应 26:result = 0 * 26 + 26 = 26。
- Y 对应 25:result = 26 * 26 + 25 = 701。
最终返回701,符合题目要求。
算法优缺点
优点 | 缺点 |
时间复杂度 O(n):单次遍历 | 未处理溢出(如超长字符串导致结果溢出int范围) |
空间复杂度 O(1):仅需常数空间 | 假设输入全为大写字母(若含小写需额外处理) |
代码简洁直观 | 依赖ASCII连续特性(非ASCII编码可能不适用) |
新颖性分析
- 无0进制的数学映射:
将无0的Excel列名映射为数学上的26进制数,通过公式 result = result * 26 + value 实现进制转换,避免了传统进制转换中需要处理0的特殊情况。 - 逆向权重计算:
虽然列名从左到右书写(如 AB),但算法通过 累乘26 直接实现高位到低位的权重计算,无需显式存储或反转字符串。 - 鲁棒性扩展思路:
- 大小写兼容:可增加 toupper() 函数处理小写输入。
- 溢出防御:改用 long long 存储结果,并在返回前检查是否超出 INT_MAX。
扩展思考
- 反向问题(列序号→列名):需处理进制转换中的余数调整(如余数0对应Z,同时商减1)。
- 多维扩展:若Excel支持更多符号(如AA→27, AAA→703),算法仍可直接复用。
- 分布式场景:若列名分布在多个节点,可通过哈希映射并行计算各部分值,再合并结果。
总结
该算法通过巧妙的数学映射和逐位累加,将看似特殊的Excel列名转换为直观的数值问题。其设计体现了 “化特殊为一般” 的思维,通过简单公式解决复杂规则,是进制类问题的经典实践。
猜你喜欢
- 2025-08-02 C|在一个结构体嵌套一个共用体实现一体多用
- 2025-08-02 C++中,常用的强制类型转换函数
- 2025-08-02 如何使用C语言编程实现一个推箱子游戏?技术核心和算法实现
- 2025-08-02 C++20 新特性(24):模板访问权限和typename的放宽
- 2025-08-02 C++零基础到工程实践
- 2025-05-14 “Rust真能防住C代码里的那些老问题吗?我们做了个实验验证”
- 2025-05-14 C语言连续生成不同的随机数方法实例加程序
- 2025-05-14 C++20尝鲜:新增语法糖
- 2025-05-14 C 语言的整数提升
- 2025-05-14 C语言之位运算符
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)