外观
表列序号
⭐ 题目日期:
百度 - 2024/12/3
🌳 题目描述:
给定一个字符串,表示 Excel 表格中的列名称,返回相对应的序号。 其中:
- A -> 1
- B -> 2
- ...
- Z -> 26
- AA -> 27
示例 1:
输入:columnTitle = "C"
输出:3
示例 2:
输入:columnTitle = "AC"
输出:29
🕵🏽♂️ 面试评估:
这道题主要考察候选者是否能够通过进制转换的思想来计算字母对应的列序号,且是否能够正确应用数学公式进行字符串的解析与数值累加。
🧗难度系数:
⭐️
📝思路分析:
每个字符的范围是从 'A' 到 'Z',对应的数值是从 1 到 26,我们可以把它看作是一个近似进制转换问题。而进制转换有两个核心要素:数值和权重。字符 A - Z 对应数值 1 - 26,权重从低位到高位,最低从 1 开始,每升一位权重乘以 26。所以对于每一位字符所表示的值 = value * weight。
以案例 "AC" 为例: 要求 "AC" 表示的值,得知道每一位字符代表的值,然后将其相加即可。我们从后往前遍历,也就是从低位到高位遍历
- "C" 为单个字符的数值为 3, 可以用 'C' - 'A' + 1 得出, 由于 C 在最低位,故权重为 1。所以 C 的值为 3 * 1 = 3.
- "A" 为单个字符的数值为 1, "A" 的权重为上一个字符的权重乘以 26,即 1 x 26 = 26。所以 A 的值为 1 * 26 = 26 总的和 = "C"的值 + "A"的值 = 29
💻代码(Java、Python、C++):
Java
public int titleToNumber(String columnTitle) {
int result = 0;
int weight = 1;
for (int i = columnTitle.length() - 1; i >= 0; i--) {
result += (columnTitle.charAt(i) - 'A' + 1) * weight;
weight *= 26;
}
return result;
}
Python
def titleToNumber(self, columnTitle: str) -> int:
result = 0
weight = 1
for i in range(len(columnTitle) - 1, -1, -1):
result += (ord(columnTitle[i]) - ord("A") + 1) * weight
weight *= 26
return result
C++
#include <string>
using namespace std;
class Solution {
public:
int titleToNumber(string columnTitle) {
int result = 0;
long weight = 1; // 防止整数溢出
for (int i = columnTitle.length() - 1; i >= 0; i--) {
result += (columnTitle[i] - 'A' + 1) * weight;
weight *= 26;
}
return result;
}
};
🚵🏻复杂度分析:
- 时间复杂度:O(n),n 为字符串的长度。
- 空间复杂度:O(1),只使用了常数空间来存储变量。