每日一道 LeetCode (38):Excle 表列名稱

每天 3 分鐘,走上算法的逆襲之路。

前文合集

每日一道 LeetCode 前文合集

代碼倉庫

GitHub: https://github.com/meteor1993/LeetCode

Gitee: https://gitee.com/inwsy/LeetCode

題目:Excle 表列名稱

題目來源:https://leetcode-cn.com/problems/excel-sheet-column-title/

給定一個正整數,返回它在 Excel 表中相對應的列名稱。

例如,

    1 -> A
    2 -> B
    3 -> C
    ...
    26 -> Z
    27 -> AA
    28 -> AB 
    ...

示例 1:

輸入: 1
輸出: "A"

示例 2:

輸入: 28
輸出: "AB"

示例 3:

輸入: 701
輸出: "ZY"

解題思路

這道題讀完一遍完全不知道是讓算什麼東西,但是我如果把解題的思路講出來,我相信有一半的小夥伴都會做。

我如果再舉兩個例子,我相信超過 90% 的小夥伴都會做。

嗯,我就是那個不看答案不會做一看答案就懂的人。

這道題實際上是在求一個十進制數對應的 26 進制的結果是什麼,如果把 Excel 的列名命名規則理解成是一個 26 進制。

現在明白是在求什麼了,那麼 10 進制轉其他進制怎麼轉。

先看個最簡單的例子, 10 進制轉 10 進制。

我們用 123 舉例子:

123 / 10^0 % 10 = 3
123 / 10^1 % 10 = 2
123 / 10^2 % 10 = 1

然後我們把結果逆序輸出得到了 123 。

如果是轉 2 進制呢?

123 / 2^0 % 2 = 1
123 / 2^1 % 2 = 1
123 / 2^2 % 2 = 0
123 / 2^3 % 2 = 1
123 / 2^4 % 2 = 1
123 / 2^5 % 2 = 1
123 / 2^6 % 2 = 1

把結果逆序輸出後得到的是 1111011 。

那麼轉 26 進制怎麼轉實際上已經有結果了。

123 / 26^0 % 26 = 19
123 / 26^1 % 26 = 4

對應到這道題裏的結果就是 A + 4A + 19 得到的 ASCII 值轉成字母再逆序輸出,得到的結果是 ET

public String convertToTitle(int n) {
    StringBuilder sb = new StringBuilder();
    while (n != 0) {
        n--;
        sb.append((char) ('A' + n % 26));
        n /= 26;
    }
    return sb.reverse().toString();
}

注意這裏有一個 n-- ,因爲正常的 26 進制是從 0 ~ 25 的,是沒有最高位 26 的,但是這道題的範圍是 1 ~ 26 ,所以每次計算的時候需要將 n 減去 1 。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章