LeetCode 第171題:Excel表列序號
題目描述
給你一個字符串 columnTitle
,表示 Excel 表格中的列名稱。返回 該列名稱對應的列序號。
例如:
A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28
...
難度
簡單
題目鏈接
點擊在LeetCode中查看題目
示例
示例 1:
輸入: columnTitle = "A"
輸出: 1
示例 2:
輸入: columnTitle = "AB"
輸出: 28
示例 3:
輸入: columnTitle = "ZY"
輸出: 701
示例 4:
輸入: columnTitle = "FXSHRXW"
輸出: 2147483647
提示
1 <= columnTitle.length <= 7
columnTitle
僅由大寫英文組成columnTitle
在范圍["A", "FXSHRXW"]
內
解題思路
方法:26進制轉換
本題是第168題的逆問題,是將26進制數轉換為10進制數。需要注意的是,Excel列名是從1開始的,而不是0(A對應1,而不是0)。
關鍵點:
- 將問題視為26進制轉10進制的轉換
- 遍歷字符串,對每個字符計算其對應的數值并累加到結果中
- 注意Excel列名是從1開始的,計算時需要將字符映射為1-26,而不是0-25
時間復雜度:O(n),其中n是字符串的長度。
空間復雜度:O(1),只需要常數額外空間。
代碼實現
C# 實現
public class Solution {public int TitleToNumber(string columnTitle) {int result = 0;foreach (char c in columnTitle) {// 將字符轉換為對應的數值(A=1, B=2, ..., Z=26)int value = c - 'A' + 1;// 累加到結果中,相當于進位操作result = result * 26 + value;}return result;}
}
Python 實現
class Solution:def titleToNumber(self, columnTitle: str) -> int:result = 0for c in columnTitle:# 將字符轉換為對應的數值(A=1, B=2, ..., Z=26)value = ord(c) - ord('A') + 1# 累加到結果中,相當于進位操作result = result * 26 + valuereturn result
C++ 實現
class Solution {
public:int titleToNumber(string columnTitle) {int result = 0;for (char c : columnTitle) {// 將字符轉換為對應的數值(A=1, B=2, ..., Z=26)int value = c - 'A' + 1;// 累加到結果中,相當于進位操作result = result * 26 + value;}return result;}
};
性能分析
各語言實現的性能對比:
實現語言 | 執行用時 | 內存消耗 | 特點 |
---|---|---|---|
C# | 80 ms | 36.3 MB | 實現簡潔,性能適中 |
Python | 32 ms | 16.2 MB | 代碼最簡潔 |
C++ | 0 ms | 6.0 MB | 性能最優 |
補充說明
代碼亮點
- 使用進制轉換思想解決問題
- 巧妙處理1-based的問題,將字符映射到1-26
- 代碼簡潔,易于理解
常見錯誤
- 將字符映射到0-25而不是1-26,導致計算錯誤
- 沒有正確處理進位操作,導致計算錯誤
- 沒有考慮大數情況,可能導致溢出
相關題目
- 168. Excel表列名稱
- 12. 整數轉羅馬數字
- 13. 羅馬數字轉整數