LeetCode——171. Excel表列序号

题目描述

题干:
给定一个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

文章如果存在问题或者有更好的题解,希望大佬斧正和评论,各自努力,你我最高处见
posted @ 2021-03-16 12:29  21岁还不是架构师  阅读(69)  评论(0编辑  收藏  举报