一、题目描述
给你一个字符串 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"]
内
二、解题思路
这个问题可以看作是一个26进制数转10进制数的问题。在Excel的列名称中,'A’到’Z’可以看作是1到26的数字。例如,'AA’可以看作是126^1 + 126^0,'AB’可以看作是126^1 + 226^0,以此类推。
具体步骤如下:
- 初始化一个变量result,用于存储最终的结果。
- 遍历输入的字符串columnTitle,从左到右。
- 对于每一个字符,首先将其转换为对应的数字('A’为1,'B’为2,…,'Z’为26)。
- 将这个数字乘以26的(字符串长度-当前位置-1)次方,并加到result上。
- 遍历结束后,result就是所求的结果。
三、具体代码
class Solution {
public int titleToNumber(String columnTitle) {
int result = 0;
for (int i = 0; i < columnTitle.length(); i++) {
int num = columnTitle.charAt(i) - 'A' + 1; // 将字符转换为对应的数字
result = result * 26 + num; // 累加到结果中
}
return result;
}
}
四、时间复杂度和空间复杂度
1. 时间复杂度
- 代码中有一个for循环,这个循环遍历了输入字符串
columnTitle
的每一个字符。 - 循环的次数与输入字符串的长度
n
成正比,即循环执行了n
次。 - 在循环内部,代码执行了常数时间的操作(字符转换和累加计算)。
因此,该代码的时间复杂度是O(n),其中n是输入字符串columnTitle
的长度。
2. 空间复杂度
- 代码中使用了固定数量的变量(
result
和循环中的i
以及num
),这些变量占用的空间不会随着输入字符串长度的增加而增加。 - 除了输入字符串外,没有使用额外的数据结构,如数组、列表或哈希表等。
因此,该代码的空间复杂度是O(1),即使用了常数级别的额外空间。
五、总结知识点
1. 循环结构:
for (int i = 0; i < columnTitle.length(); i++)
:使用了一个for循环,遍历字符串columnTitle
中的每一个字符。
2. 字符与整数的转换:
int num = columnTitle.charAt(i) - 'A' + 1;
:使用charAt(i)
方法获取字符串中索引为i
的字符,然后通过减去字符'A'
的ASCII值并加1,将字符转换为对应的数字('A’到’Z’对应1到26)。
3. 算术运算:
result = result * 26 + num;
:执行了乘法和加法运算,将之前的结果乘以26(表示26进制),然后加上当前字符对应的数字。
4. 方法返回值:
return result;
:返回方法计算得到的结果。
5. 字符串操作:
columnTitle.length()
:获取字符串的长度。columnTitle.charAt(i)
:获取字符串中指定索引位置的字符。
以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。