优秀的编程知识分享平台

网站首页 > 技术文章 正文

C语言实战之Excel表列序号

nanyue 2025-05-14 15:27:56 技术文章 11 ℃

题目要求

给出一个字符串 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. 关键步骤

  1. 初始化:结果变量 result 初始化为0。
  2. 遍历字符
  • 对每个字符计算其值:字符 - 'A' + 1(如 B → 2)。
  • 更新结果:result = result * 26 + 当前字符值。
  1. 返回结果:遍历结束后,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编码可能不适用)


新颖性分析

  1. 无0进制的数学映射
    将无0的Excel列名映射为数学上的26进制数,通过公式 result = result * 26 + value 实现进制转换,避免了传统进制转换中需要处理0的特殊情况。
  2. 逆向权重计算
    虽然列名从左到右书写(如 AB),但算法通过 累乘26 直接实现高位到低位的权重计算,无需显式存储或反转字符串。
  3. 鲁棒性扩展思路
  4. 大小写兼容:可增加 toupper() 函数处理小写输入。
  5. 溢出防御:改用 long long 存储结果,并在返回前检查是否超出 INT_MAX。

扩展思考

  • 反向问题(列序号→列名):需处理进制转换中的余数调整(如余数0对应Z,同时商减1)。
  • 多维扩展:若Excel支持更多符号(如AA→27, AAA→703),算法仍可直接复用。
  • 分布式场景:若列名分布在多个节点,可通过哈希映射并行计算各部分值,再合并结果。

总结

该算法通过巧妙的数学映射和逐位累加,将看似特殊的Excel列名转换为直观的数值问题。其设计体现了 “化特殊为一般” 的思维,通过简单公式解决复杂规则,是进制类问题的经典实践。

Tags:

最近发表
标签列表