给定一个Excel表格中的列名称,返回其相应的列序号

算法 专栏收录该内容
3 篇文章 0 订阅

给定一个Excel表格中的列名称,返回其相应的列序号。

例如,

    A -> 1
    B -> 2
    C -> 3
    ...
    Z -> 26
    AA -> 27
    AB -> 28 
    ...

示例 1:

输入: "A"
输出: 1

示例 2:

输入: "AB"
输出: 28

示例 3:

输入: "ZY"
输出: 701

 

可能这道题太简单,网上的答案都没有解释步骤,笨人自有笨办法。

class Solution {
public:
    int titleToNumber(string s) {
        int result = 0;
        for (int i = 0; i < s.size(); i++) {
            result += (s [i] - 64) * pow(26, s.size() - i - 1);
        }
        return result;
    }
};

答案如上,没几行但是花了很长时间来推导。以下为说明:

1 如“D”这个字符串可以认为只有一个个位,因为A对应1,D就对应4,因为中间有B和C夹在中间数过来差距为3.用式子表达其实就是(字符串 - 'A')就为该字符串对应的那个数。对应上面代码(s [i] - 64),为何是64需要推导一次,不多说。

2 如“DD”这个字符串可以认为有十和个两个位,其实和十进制一样推导,除了个位满26才向十位进一个字母,换句话说十位的字符离A的距离都需要乘以26而不是10来表达这个位的值。用式子表达其实就是((十位字符 - 64)* 26 + (个位字符 - 64)),和十进制是一样的模式。

3 如“DDD”认为有百十个三个位,用式子表达其实就是((百位字符 - 64)* 26 * 26 + (十位字符 - 64)* 26 + (个位字符 - 64)),到这里其实和上面代码已经比较相似了。

4 根据以上的方式,就可以泛化推导出((百位字符 - 64)* (26的2次方) + (十位字符 - 64)* (26的1次方) + (个位字符 - 64)(26的0次方)),而这个就是上面代码的公式。

5 有了公式现在要转换为代码有几个需要注意的点:

        1)整个字符串的结果值其实是由个十百千位的数字分别乘以各自的位数加起来的。如99实际上是9 * 10 + 9.那么就

需要对整个字符串分别取出再逐一做加法。这就对应了代码中的循环和(result += )。

        2)26的i次方,i对应的是当前字符处在哪个位上,而位和循环的方向i是相反的,因此要用(s.size() - i - 1)来解决。

        3)以上如若不明白,还是需要动手,动手拿笔演算以及敲代码,因为该题既包含了数学知识如对十进制的理解和迁移,同样也包含代码知识如对循环的深入理解。

 

  • 1
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值