网站首页 > 技术文章 正文
题目要求
给出一个字符串 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-05-14 “Rust真能防住C代码里的那些老问题吗?我们做了个实验验证”
- 2025-05-14 C语言连续生成不同的随机数方法实例加程序
- 2025-05-14 C++20尝鲜:新增语法糖
- 2025-05-14 C 语言的整数提升
- 2025-05-14 C语言之位运算符
- 2025-05-14 CSP-J 2024 信奥赛入门组第一轮初赛真题及答案解析(C++)
- 2025-05-14 C/C++快速排序
- 2025-05-14 C语言基础练习10-条件运算符实现成绩等级
- 2025-05-14 单片机C语言基础分享,变量声明与数据类型
- 2025-05-14 C C++ 中自定义可变参数函数调用其它可变参数函数
- 1507℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 516℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 489℃MySQL service启动脚本浅析(r12笔记第59天)
- 468℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 466℃启用MySQL查询缓存(mysql8.0查询缓存)
- 446℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 426℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 423℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)