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 的倍數)出錯