Fork me on GitHub

leetcode之168. Excel表列名称

题目描述:

给定一个正整数,返回它在 Excel 表中相对应的列名称。

例如,

1
2
3
4
5
6
7
8
9
>     1 -> A
> 2 -> B
> 3 -> C
> ...
> 26 -> Z
> 27 -> AA
> 28 -> AB
> ...
>

示例 1:

1
2
3
> 输入: 1
> 输出: "A"
>

示例 2:

1
2
3
> 输入: 28
> 输出: "AB"
>

示例 3:

1
2
3
> 输入: 701
> 输出: "ZY"
>

解题思路一:

时间复杂度:$O(n)$,空间复杂度:$O(1)$.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
class Solution {
public:
string convertToTitle(int n) {
vector<char> vec(26);
string s = "";
// vec[0] = 'A';
// vec[1] = 'B';
// vec[2] = 'C';
// vec[3] = 'D';
// vec[4] = 'E';
// vec[5] = 'F';
// vec[6] = 'G';
// vec[7] = 'H';
// vec[8] = 'I';
// vec[9] = 'J';
// vec[10] = 'K';
// vec[11] = 'L';
// vec[12] = 'M';
// vec[13] = 'N';
// vec[14] = 'O';
// vec[15] = 'P';
// vec[16] = 'Q';
// vec[17] = 'R';
// vec[18] = 'S';
// vec[19] = 'T';
// vec[20] = 'U';
// vec[21] = 'V';
// vec[22] = 'W';
// vec[23] = 'X';
// vec[24] = 'Y';
// vec[25] = 'Z';

//写一个for循环
for (int i = 0; i < 26; ++i)
{
/* code */
vec[i] = 'A' + i;

}


while(n > 26)
{
g = n % 26;


if(g > 0)
s = vec[g -1] + s;
else
{
s = vec[25] + s;
n--;
}
n = n / 26;

}

if(n <= 26)
s = vec[n -1] + s;


return s;
}
};

解题思路二:

时间复杂度:$O(n)$,空间复杂度:$O(1)$.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
string convertToTitle(int n) 
{
// 定义一个字符串
string re = "";
while(n != 0){
int cur = n;
char temp;
// 这里不太清楚呢
// 如果余26==0,那么说明是最后一个元素,需要减1
if(cur % 26 != 0)
temp = 'A' + cur % 26 - 1;
else{
temp = 'Z';
n--;
}
re = temp + re;
n/=26;
}
return re;
}