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"
Constraints:
1 <= columnNumber <= 2^31 - 1
Solved after others’ solution…
It’s not a standard base transformation problem, because there’s no 0s in this. For example, z
is 26, and 27 is not a0
but aa
.
Let’s write more examples:
A 1 AA 26+ 1 BA 2×26+ 1 ... ZA 26×26+ 1 AAA 1×26²+1×26+ 1
B 2 AB 26+ 2 BB 2×26+ 2 ... ZB 26×26+ 2 AAB 1×26²+1×26+ 2
. . .. ..... .. ....... ... .. ........ ... .............
. . .. ..... .. ....... ... .. ........ ... .............
. . .. ..... .. ....... ... .. ........ ... .............
Z 26 AZ 26+26 BZ 2×26+26 ... ZZ 26×26+26 AAZ 1×26²+1×26+26
So now we know, for ABCD
it denotes: 1 ∗ 2 6 3 + 2 ∗ 2 6 2 + 3 ∗ 26 + 4 1*26^3+2*26^2+3*26+4 1∗263+2∗262+3∗26+4
When in standard base transformation, we would have A
as 0
, B
as 1
, so here the rule for ABCD
is actually like: 1 ∗ 2 6 3 + 2 ∗ 2 6 2 + 3 ∗ 26 + 4 = ( A + 1 ) ∗ 2 6 3 + ( B + 1 ) ∗ 2 6 2 + ( C + 1 ) ∗ 26 + ( D + 1 ) 1*26^3+2*26^2+3*26+4=(A+1)*26^3+(B+1)*26^2+(C+1)*26+(D+1) 1∗263+2∗262+3∗26+4=(A+1)∗263+(B+1)∗262+(C+1)∗26+(D+1)
Then by subtract 1
every time we would get the right answer.
Time complexity: log ( n ) \log(n) log(n)
Space complexity: o ( 1 ) o(1) o(1)
class Solution:
def convertToTitle(self, columnNumber: int) -> str:
convert_map = {i: chr(ord('A') + i) for i in range(26)}
res = ''
while columnNumber > 0:
columnNumber -= 1
cur_digit = columnNumber % 26
res += str(convert_map[cur_digit])
columnNumber //= 26
return res[::-1]