LeetCode171-Excel表列序号
- 1、问题描述
- 2、解题思路:进制转换
- 3、代码实现
1、问题描述
给你一个字符串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"]
内
2、解题思路:进制转换
这个我们可以仿照十进制中的进制转换方法,通常我们在从高位向低位处理的时候,起始设置nums=0,然后每次使用当前位的数值更新nums,更新的公式为 n u m s = n u m s ∗ 10 + v nums=nums*10+v nums=nums∗10+v,这个v就是当前位的数字。
本题只需要将10进位换成26即可(A-Z有26个字母),即更新公式为 n u m s = n u m s ∗ 26 + v nums=nums*26+v nums=nums∗26+v
假设我们给的输入为columnTitle='ZY'
,首先Z和Y对应的索引分别为26和25(从1开始,这道题没有0对应的字母),那么我们的计算公式如下:
n
u
m
s
=
0
n
u
m
s
=
n
u
m
s
∗
26
+
26
=
0
∗
26
+
26
=
26
n
u
m
s
=
n
u
m
s
∗
26
+
25
=
26
∗
26
+
25
=
701
nums=0 \\ nums=nums*26+26=0*26+26=26 \\ nums=nums*26+25=26*26+25=701
nums=0nums=nums∗26+26=0∗26+26=26nums=nums∗26+25=26∗26+25=701
3、代码实现
由于本题没有0,所以代码中在减去’A’之后要+1.
package leetcode1;
/**
* Excel表列序号
*/
public class LeetCode171 {
/**
* 进制转换,
* 通用规则如下,ans=0,ans=ans*进制+vali
* 这里为ans=ans*26+vali,但是由于没有0,所以减去'A'之后要+1
*/
public static int titleToNumber(String columnTitle) {
int ans=0;
for (int i = 0; i <columnTitle.length(); i++) {
int num = columnTitle.charAt(i) - 'A' + 1;
ans=ans*26+num;
}
return ans;
}
public static void main(String[] args) {
System.out.println(titleToNumber("ZY"));
System.out.println(titleToNumber("FXSHRXW"));
System.out.println(titleToNumber("AZY"));
}
}
测试结果如下: