题目链接:https://leetcode.cn/problems/excel-sheet-column-number/description/
题目描述
给你一个字符串 columnTitle
,表示 Excel 表格中的列名称。返回 该列名称对应的列序号
。
例如:
A -> 1
B -> 2
C -> 3
…
Z -> 26
AA -> 27
AB -> 28
…
示例 1
输入: columnTitle = “A”
输出: 1
示例 2
输入: columnTitle = “AB”
输出: 28
示例 3
输入: columnTitle = “ZY”
输出: 701
提示
- 1 <= columnTitle.length <= 7
- columnTitle 仅由大写英文组成
- columnTitle 在范围 [“A”, “FXSHRXW”] 内
Code
解法一:暴力遍历 + 位权计算
本题最主要的其实就是发现这是个特殊的26进制(因为是从1开始计数的而不是0),我们上来可以先按照正常的N进制转十进制的做法来写,将String表示成对应的数字可以用switch或者逻辑运算
switch写法,十分繁琐(不建议)
class Solution {
public int titleToNumber(String columnTitle) {
//特殊的26进制,A->1:65 Z->26:90
int res = 0;
for (int i = 0; i < columnTitle.length(); i++) {
int temp = 0;
switch (columnTitle.charAt(i)) {
case 'A' -> temp = 1;
case 'B' -> temp = 2;
case 'C' -> temp = 3;
case 'D' -> temp = 4;
case 'E' -> temp = 5;
case 'F' -> temp = 6;
case 'G' -> temp = 7;
case 'H' -> temp = 8;
case 'I' -> temp = 9;
case 'J' -> temp = 10;
case 'K' -> temp = 11;
case 'L' -> temp = 12;
case 'M' -> temp = 13;
case 'N' -> temp = 14;
case 'O' -> temp = 15;
case 'P' -> temp = 16;
case 'Q' -> temp = 17;
case 'R' -> temp = 18;
case 'S' -> temp = 19;
case 'T' -> temp = 20;
case 'U' -> temp = 21;
case 'V' -> temp = 22;
case 'W' -> temp = 23;
case 'X' -> temp = 24;
case 'Y' -> temp = 25;
case 'Z' -> temp = 26;
}
res += Math.pow(26, columnTitle.length() - 1 - i) * temp;
}
return res;
}
}
逻辑运算,方便快捷
class Solution {
public int titleToNumber(String columnTitle) {
//特殊的26进制,A->1:65 Z->26:90
int res = 0;
for (int i = 0; i < columnTitle.length(); i++) {
int temp = columnTitle.charAt(i) -'A' + 1;
res += Math.pow(26, columnTitle.length() - 1 - i) * temp;
}
return res;
}
}
解法二:暴力遍历 + 位权优化
26为一个进制,我们会从头到尾遍历整个columnTitle,我们从位权最高的项开始,当我们每次循环一次,上一次的结果就要提高一次位权(索引从0开始刚好对应权重)
如CBD = 3X26²+2X26¹+4X26⁰
第一次循环:3
第二次循环:3X26+2
第三次循环:(3X26+2)X26+4
class Solution {
public int titleToNumber(String columnTitle) {
//特殊的26进制,A->1:65 Z->26:90
int res = 0;
for (int i = 0; i < columnTitle.length(); i++) {
int temp = columnTitle.charAt(i) -'A' + 1;
res = res * 26 + temp;
}
return res;
}
}
这样可以减少pow方法的调用,节约运行时间,此处是int类型,若是范围更大还需要考虑结果大小的问题,防止挤爆当前长度