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

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

 

你可能感兴趣的:(算法)