Excel Sheet Column Number
Related to question Excel Sheet Column Title
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
public class Solution {
public int titleToNumber(String s) {
if(s.equals("")) return 0;
char[] title = s.toCharArray();
int len = title.length;
int num = 0;
for(int i=0; i<len; i++){
num += (int) ((title[i] - 'A' + 1) * Math.pow(26, len-i-1));
}
return num;
}
}
Excel Sheet Column Title
Given a positive integer, return its corresponding column title as appear in an Excel sheet.
For example:
1 -> A
2 -> B
3 -> C
...
26 -> Z
27 -> AA
28 -> AB
public class Solution {
public String convertToTitle(int n) {
StringBuilder sb = new StringBuilder();
int mod = 0;
char c;
while(n > 0){
mod = (n-1) % 26;
c = (char) (65 + mod);
sb.append(c);
n = (n-1) / 26;
}
return sb.reverse().toString();
}
}
答案这里的用(n-1)很重要,如果将上述答案中的(n-1)改为n,然后把65 改为64(ASCII中‘A’是65),你会发现,对于大多数转换依然是对的,但是对于出现了‘Z’的转换会出错,为什么呢?
首先,这两道题无非就是 10进制 与 26进制 相互转换,而我们在学习基础编程语言,比如C++和Java时,相信 10进制 与 16进制 相互转换时最常见的题目了,所以博主一开始也是没有多想,在第二道题上,用【取模运算得到最低位的字符】,然后用【除法运算消去最低位】的算法。但是,在这里真的可以用【除法运算消去最低位】吗?
如果最低位是 Z ,也就代表了26,除以一个26,结果是 1 啊,没有消去;但是如果最低位是A-Y的话,做一个除法,结果就是0了,成功消去了最低位,这也是为什么刚刚错误的算法对于大多数情况得出的结果还是对的的原因。
参照10进制转16进制。16进制的数字是从0开始编码的(0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F),可以理解为(0-15),一个位上的最大的数也就是15,除以基数16,最低位就消去了。所以,10进制转16机制中,是没有上述问题的。
所以,博主想到的办法就是n-1,使除法运算可以消去最低位;而且n-1对于取模运算实际上没什么影响,因为最后的结果无非就是差了1而已:
(A-1)% 26 = 0;
(Z-1)% 26 = 25;
太容易修正了。