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; } }