开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情
一、题目描述:
171. Excel 表列序号 - 力扣(LeetCode) (leetcode-cn.com)
给你一个字符串 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"] 内
二、思路分析:
这题其实我们只要抓住规律就可以啦。对于columnTitle,举个例子,比如对“ZY”,我们是这么计算它是第几列的:
- 首先遍历该字符串,取到字符'Z'。
- 因为其在第二位,所以说明之前第二位的A-Y都已经有了26个数,再加上只有一位时候的26个数,说明第二位是'Z'的时候前面至少有 个数。将其加入我们的答案中
- 继续遍历字符串,得到字符'Y'。
- 因为其在第一位,所以只要直接加上它本身(也就是 ),加入答案中
- 遍历完字符串,得到701,返回即可
因此本题每个位置上的字符我们都可以计算出在这之前有多少个字符,具体计算就是 (c - 'A' + 1) * Math.pow(26, columnTitle.length() - i - 1),其中c是当前位置的字符,columnTitle.length()是该字符串的长度,i是当前位置字符的索引。
具体可以看代码~理解了这个过程模拟起来还是十分简单的。
三、AC 代码:
class Solution {
public int titleToNumber(String columnTitle) {
int titleNumber = 0;
for (int i = 0; i < columnTitle.length(); i++) {
char c = columnTitle.charAt(i);
titleNumber += (c - 'A' + 1) * Math.pow(26, columnTitle.length() - i - 1);
}
return titleNumber;
}
}
四、总结:
- 此题本质上就是进制转换问题,遍历给定字符串中的每个字符;
- 对每一位的字符对应的和为 26 的 n 次方 * 对应的数字;
- 次方就是长度减当前字符串所在的下标;