LeetCode--Excel Sheet Column Number

Given a column title as appear in an Excel sheet, return its corresponding column number.

For example:

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

题目大意:给出一个Excel中的列标,请输出它对应的列数。
题目分析:大致是一个二十六进制转化为十进制的计算。A-Z表示1-26,给出字符串后,第n位字符 * 26^第n位字符次方一次相加,因此需要一个map来映射A-Z对应的1-26个数字,然后相乘并相加即可。
代码如下:(解法一)
public class Solution {
    public int titleToNumber(String s) {
        HashMap<Character, Integer> h = new HashMap<Character, Integer>();
        h.put('A', 1);
        h.put('B', 2);
        h.put('C', 3);
        h.put('D', 4);
        h.put('E', 5);
        h.put('F', 6);
        h.put('G', 7);
        h.put('H', 8);
        h.put('I', 9);
        h.put('J', 10);
        h.put('K', 11);
        h.put('L', 12);
        h.put('M', 13);
        h.put('N', 14);
        h.put('O', 15);
        h.put('P', 16);
        h.put('Q', 17);
        h.put('R', 18);
        h.put('S', 19);
        h.put('T', 20);
        h.put('U', 21);
        h.put('V', 22);
        h.put('W', 23);
        h.put('X', 24);
        h.put('Y', 25);
        h.put('Z', 26);
        
        char[] ch = s.toCharArray();
        int col = 0;
        for(int i=0; i<ch.length; i++ ){
            int val = h.get(ch[i]);
            col = (int) (col + Math.pow(26, ch.length-1-i)*val);
        }
        
        return col;
    }
}

 解法二:

后来看到其他人有另外一种解法,代码更加简洁优美,思想也是朴素的二十六进制转化为十进制。举例:CAA来说,首先去除s[0]=C,它对应的数字是3,且是第三位,因此它的贡献是3*26^(3-1),而它后面刚好还有2为,因此出去它自己的位数后,还有2次机会可以乘26,因此可以用res = res * 26 + (s[i]-'A'+1)表示,代码如下:

public class Solution {
    public int titleToNumber(String s) {
        int col = 0;
        char[] a = s.toCharArray();
        for(char c : a){
            col = col * 26 + (c-'A'+1);
        }
        
        return col;
    }
}

 

posted @ 2015-05-19 10:22  江湖小妞  阅读(176)  评论(0编辑  收藏  举报