Description
給定一個正整數
columnNumber,回傳它在 Excel 表中對應的欄位標題。例如 1 -> “A”、28 -> “AB”、701 -> “ZY”。
Example:
Input: columnNumber = 28 Output: “AB”
Intuition#
核心思路:本質上是 26 進位轉換,但因為沒有 0(A=1 而非 A=0),每次需要先減 1 再取餘數。
- 一般的進位轉換直接
% base即可,但 Excel 欄位是 1-indexed(A=1, B=2, …, Z=26) - 沒有 0 的存在使得不能直接套用標準進位轉換
- 關鍵:每次取餘前先將
columnNumber減 1,使其變成 0-indexed(A=0, B=1, …, Z=25)
Approaches#
1: 迭代 26 進位轉換#
- 概念: 每次先減 1 再取
% 26得到當前位的字母,然後除以 26 處理下一位 - 時間複雜度:
O(log26 n)- 每次除以 26 - 空間複雜度:
O(log26 n)- StringBuilder 儲存結果
class Solution {
fun convertToTitle(columnNumber: Int): String {
val sb = StringBuilder()
var n = columnNumber
while (n > 0) {
n-- // 轉成 0-indexed
sb.append(('A' + n % 26).toChar())
n /= 26
}
return sb.reverse().toString()
}
}⭐2: 遞迴寫法#
- 概念: 與迭代相同的邏輯,用遞迴表達更簡潔
- 時間複雜度:
O(log26 n) - 空間複雜度:
O(log26 n)- 遞迴堆疊
class Solution {
fun convertToTitle(columnNumber: Int): String {
if (columnNumber == 0) return ""
val n = columnNumber - 1
return convertToTitle(n / 26) + ('A' + n % 26).toChar()
}
}🔑 Takeaways#
- Pattern: 非標準進位轉換——沒有 0 的情況需要先減 1 再處理
- 關鍵技巧:
n--將 1-indexed 轉為 0-indexed 是這題的核心操作,忘了減 1 會在 Z(26 的倍數)出錯