题链:https://leetcode-cn.com/problems/excel-sheet-column-title/
内容:将数字变为Excel表格字母的方式。
先考虑字母转数字
n
u
m
=
a
0
+
a
1
∗
2
6
1
+
a
2
∗
2
6
2
+
a
3
∗
2
6
3
+
.
.
.
+
a
n
−
1
∗
2
6
n
−
1
num=a_0+a_1*26^1 + a_2*26^2+a_3*26^3+...+a_n-1*26^{n-1}
num=a0+a1∗261+a2∗262+a3∗263+...+an−1∗26n−1
这和26进制特别像,但需要注意的是
1
<
=
a
0
,
a
1
,
.
.
.
,
a
n
−
1
<
=
26
1<=a_0,a1,...,a_{n-1}<=26
1<=a0,a1,...,an−1<=26,而26进制则要求
0
<
=
a
0
,
a
1
,
.
.
.
,
a
n
−
1
<
=
25
0<=a_0,a1,...,a_{n-1}<=25
0<=a0,a1,...,an−1<=25
思路一
公式变换:
n
u
m
−
1
=
a
0
−
1
+
a
1
∗
2
6
1
+
a
2
∗
2
6
2
+
a
3
∗
2
6
3
+
.
.
.
+
a
n
−
1
∗
2
6
n
−
1
num-1=a_0-1+a_1*26^1 + a_2*26^2+a_3*26^3+...+ \\ a_n-1*26^{n-1}
num−1=a0−1+a1∗261+a2∗262+a3∗263+...+an−1∗26n−1
那么
n
u
m
−
1
m
o
d
26
=
a
0
−
1
num-1 \ mod \ 26=a_0-1
num−1 mod 26=a0−1
接下来,另
n
u
m
1
=
(
n
u
m
−
a
0
)
/
26
num1=(num-a_0)/26
num1=(num−a0)/26,则
n
u
m
1
−
1
=
a
1
+
a
2
∗
2
6
1
+
a
3
∗
2
6
2
+
.
.
.
+
a
n
−
1
∗
2
6
n
−
2
num1-1=a_1 + a_2*26^1+a_3*26^2+...+ a_{n-1}*26^{n-2}
num1−1=a1+a2∗261+a3∗262+...+an−1∗26n−2
那么
n
u
m
1
−
1
m
o
d
26
=
a
1
−
1
num1-1 \ mod \ 26=a_1-1
num1−1 mod 26=a1−1
以此类推,便可得到结果。
class Solution {
public:
string convertToTitle(int columnNumber) {
string ans = "";
while (columnNumber > 0) {
int x = (columnNumber - 1) % 26;
ans += x+1-1 + 'A';
columnNumber = (columnNumber - x) / 26;
}
reverse(ans.begin(), ans.end());
return ans;
}
};
思路二
之前说到了,与26进制不同的仅仅是系数多了1,那我们只需在常规求26进制的时候提前减1即可。
class Solution {
public:
string convertToTitle(int columnNumber) {
string ans;
while (columnNumber--) {
int a0 = columnNumber % 26 ;
ans += a0 + 'A';
columnNumber /= 26;
}
reverse(ans.begin(), ans.end());
return ans;
}
};