LeetCode第171题 – Excel表列序号

302 views

题目

给定一个Excel表格中的列名称,返回其相应的列序号。

例如,

A -> 1
B -> 2
C -> 3

Z -> 26
AA -> 27
AB -> 28

示例 1:

输入: “A”
输出: 1
示例 2:

输入: “AB”
输出: 28
示例 3:

输入: “ZY”
输出: 701

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/excel-sheet-column-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解答

  • 思路一
class Solution {
    public int titleToNumber(String s) {
        if (s == null) {
            return 0;
        }
        
        s = s.trim().toUpperCase(java.util.Locale.US);
        if (s.isEmpty()) {
            return 0;
        }
        
        String[][] sheets = {
                {"0", "0"}
                ,{"A", "1"}
                ,{"B", "2"}
                ,{"C", "3"}
                ,{"D", "4"}
                ,{"E", "5"}
                ,{"F", "6"}
                ,{"G", "7"}
                ,{"H", "8"}
                ,{"I", "9"}
                ,{"J", "10"}
                ,{"K", "11"}
                ,{"L", "12"}
                ,{"M", "13"}
                ,{"N", "14"}
                ,{"O", "15"}
                ,{"P", "16"}
                ,{"Q", "17"}
                ,{"R", "18"}
                ,{"S", "19"}
                ,{"T", "20"}
                ,{"U", "21"}
                ,{"V", "22"}
                ,{"W", "23"}
                ,{"X", "24"}
                ,{"Y", "25"}
                ,{"Z", "26"}
        };
        
        int result = 0;
        int length = s.length();
        for (int i = 0; i < length; ++i) {
            char c = s.charAt(i);
            String cs = String.valueOf(c);
            int value = 0;
            
            for (int j = 0; j < sheets.length; ++j) {
                if (sheets[j][0].equals(cs)) {
                    value = Integer.parseInt(sheets[j][1]);
                    break;
                }
            }
            result = result * 26 + value;
        }
        
        return result;
    }
}
  • 思路二
class Solution {
    public int titleToNumber(String s) {
        if (s == null) {
            return 0;
        }
        
        s = s.trim().toUpperCase(java.util.Locale.US);
        if (s.isEmpty()) {
            return 0;
        }
            
        int result = 0;
        int length = s.length();
        for (int i = 0; i < length; ++i) {
            int value = s.charAt(i) - 'A' + 1;
            
            result = result * 26 + value;
        }
        
        return result;
    }
}

要点
思路一简单、直接,但是效率低,因为运行过程中使用循环来查找字符对应的数值。
思路二的实现相对精巧,利用了字符编码的特点。

准备的用例,如下

    @Test
    public void test01() {
        assertEquals(1, new L171().titleToNumber("A"));
        assertEquals(28, new L171().titleToNumber("AB"));
        assertEquals(701, new L171().titleToNumber("ZY"));
    }


若非注明,均为原创,欢迎转载,转载请注明来源:LeetCode第171题 – Excel表列序号

关于 JackieAtHome

基层程序员,八年之后重新启航

此条目发表在 Java, LeetCode 分类目录。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Protected with IP Blacklist CloudIP Blacklist Cloud