Given an integer columnNumber
, return its corresponding column title as it appears in an Excel sheet.
For example:
A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ...
Example 1:
Input: columnNumber = 1
Output: "A"
Example 2:
Input: columnNumber = 28
Output: "AB"
Example 3:
Input: columnNumber = 701
Output: "ZY"
Example 4:
Input: columnNumber = 2147483647
Output: "FXSHRXW"
Constraints:
1 <= columnNumber <= 231 - 1
题意:给你一个整数 columnNumber
,返回它在 Excel 表中相对应的列名称。
解法 进制转换
有些类似于十进制到二十六进制的转换,不过也有不同,比如 A -> Z
对应的是 1 -> 26
,而 27
对应的是 AA
。假设给出的整数是 nnn ,对应的列名称为 akak−1…a1a0, ai∈[A, Z]a_{k} a_{k-1}\dots a_1a_0,\ a_i \in \text{[A, Z]}akak−1…a1a0, ai∈[A, Z] ,字符 aia_iai 对应到数字 (ai−A+1)∈[1,26](a_i - A + 1) \in [1, 26](ai−A+1)∈[1,26] ,于是转换规律如下:
(ak−A+1)×26k−1+⋯+(a1−A+1)×26+(a0−A+1)=n(a_k - A + 1) \times 26^{k-1} + \dots + (a_1 - A + 1) \times 26 + (a_0 - A + 1) = n(ak−A+1)×26k−1+⋯+(a1−A+1)×26+(a0−A+1)=n
因此等式左右两边同时减去 111 ,结果为:
(ak−A+1)×26k−1+⋯+(a1−A+1)×26+(a0−A)=n−1(a_k - A + 1) \times 26^{k-1} + \dots + (a_1 - A + 1) \times 26 + (a_0 - A) = n - 1(ak−A+1)×26k−1+⋯+(a1−A+1)×26+(a0−A)=n−1
此时 (a0−A)∈[0,25](a_0 - A) \in [0, 25](a0−A)∈[0,25] ,通过对 n−1n - 1n−1 模 262626 即可得到 (a0−A)(a_0 - A)(a0−A) ,即有 a0=(n−1) % 26+Aa_0 = (n - 1)\ \% \ 26 + Aa0=(n−1) % 26+A 。接着令 n−1n - 1n−1 除以 262626 得到下式,继续重复前面的步骤直到求出 aka_kak :
(ak−A+1)×26k−2+⋯+(a1−A+1)=(n−1)×26−1(a_k - A + 1) \times 26^{k-2} + \dots + (a_1 - A + 1) = (n - 1) \times 26^{-1}(ak−A+1)×26k−2+⋯+(a1−A+1)=(n−1)×26−1
对应的代码如下:
class Solution {
public:
string convertToTitle(int columnNumber) {
string ans;
do {
ans.push_back('A' + (--columnNumber % 26));
columnNumber /= 26;
} while (columnNumber);
reverse(ans.begin(), ans.end());
return ans;
}
};
运行效率如下:
执行用时:0 ms, 在所有 C++ 提交中击败了100.00% 的用户
内存消耗:5.7 MB, 在所有 C++ 提交中击败了82.75% 的用户