力扣-168-Excel 表列名称
华硕科技的面试手写算法题,我没见过,分析出了思路但是没把握写出来能过,于是挂了
string convertToTitle(int columnNumber) {
// 计算会有几位长度
long long temp = 26;
int len = 1;
while (columnNumber > temp) {
len++;
temp *= 27;
}
// 计算每一位上的具体符号
// 从高位向低位计算,比如BS,先计算B,就是在不大于num的情况下,可以被多少个26整除,这里用取模运算,剩下的小于26的余数直接转换为字母
// 如果是 BDS ,同样先计算高位可以被多少个26*26整除(也就是len-1个26的幂),然后是可以被多少个len-2的26幂整除,一直到一个小于26的整数
// 这里最好是单独抽出一个print函数用于打印26以内的数字向字母的转换,当然也可以利用ASC码
string res;
for (int i = len; i > 0; --i) {
int site = columnNumber / pow(26, i-1);
columnNumber -= pow(26, i-1)*site;
res += (char)site + 64;
}
return res;
}
这是我的代码,但是我无法解决 52 的用例 52 对应的是 AZ
题解
题解说这是情况特殊一点的进制转换题而已,在于进制映射中没有 0
string convertToTitle(int columnNumber) {
string columnTitle = "";
while (columnNumber > 0)
{
columnNumber--;
columnTitle += columnNumber % 26 + 'A';
columnNumber /= 26;
}
reverse(columnTitle.begin(),columnTitle.end());
return columnTitle;
}
并没有完全理解这道题
将代码逆向可以得到 171-Excel 表列序号的题解
int titleToNumber(string columnTitle) {
reverse(columnTitle.begin(), columnTitle.end());
long long number = 0;
for (int i = columnTitle.size(); i > 0; i--) {
number *= 26;
number += (columnTitle[i - 1] - 'A') + 1;
}
return number;
}