每天 3 分鐘,走上算法的逆襲之路。
前文合集
代碼倉庫
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 + 4
和 A + 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 。