题目描述
题干:
给定一个Excel表格中的列名称,返回其相应的列序号。
例如:
A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28
...
示例1:
输入: "A"
输出: 1
示例2:
输入: "AB"
输出: 28
示例3:
输入: "ZY"
输出: 701
题解思路
做题嘛,难免会走弯路,我特意去看了一下exec### 题目描述
题干:
给定一个Excel表格中的列名称,返回其相应的列序号。
例如:
A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28
...
示例1:
输入: "A"
输出: 1
示例2:
输入: "AB"
输出: 28
示例3:
输入: "ZY"
输出: 701
题解思路
做题嘛,难免会走弯路,我特意去看了一下Excel表最多可以多少行,本来想着可以偷个懒,结果发现多到吓人,最多可以包括1048576行和16384列!!!
行吧,那就开始找规律,从一开始算起的话,只算一个字母时,将String转换为Char再转换为int做差,第一列就做好了,可是到了第二列就复杂了
这个时候你会发现,原来这是一个26进制的规律,进制运算的话那就脱不了循环依次运算了,于是我就按我的思路这样依次循环下来了,答案是正确的
但是果然还是被自己一开始的思路蒙蔽了,没有想到从第一位开始算,所以代码复杂了些,但是思路就是这样,代码如下
正确代码
//从个位开始
public static int titleToNumber01(String columnTitle) {
int ans = 0;
int base = 26;
int flag = 0;
//正则表达式判断是否为标准格式
if (columnTitle.matches("[A-Z]+")) {
char[] strChar = columnTitle.toCharArray();
for (int length = strChar.length - 1; length >= 0; length--) {
int differ = (int) strChar[length] - 64;
ans += differ * Math.pow(base,flag++);
}
return ans;
} else {
return 0;
}
}
//从首位开始
public int titleToNumber(String s) {
int ans = 0;
for(int i=0;i<s.length();i++) {
int num = s.charAt(i) - 'A' + 1;
ans = ans * 26 + num;
}
return ans;
}
总结
其实知道每道题默认的格式不会出错,但是为了严谨每次我都会加上判断条件,所以有时候自己就会被自己折磨半天,但是好习惯终究会在以后方便的
这次用到的正则表达式如果想知道的话请看我的另一篇文章《正则表达式——MySQL搜索过滤》
https://www.cnblogs.com/bc-song/p/14446839.html
文章如果存在问题或者有更好的题解,希望大佬斧正和评论,各自努力,你我最高处见