前言
文章参考自:英雄哪里出来
LeetCode 168. Excel表列名称
原题链接:168. Excel表列名称
分析
由题意得excel 表相当于26进制,且是按 A~Z 计数的。
那只需要十进制转26进制,利用整数每次对26取模,再加上字符A,因为取模结果为相对于A的偏移量。
代码
void Reverse(char* str)
{
int left = 0, right = strlen(str) - 1;
while (left < right)
{
char tmp = str[left];
str[left] = str[right];
str[right] = tmp;
left++;
right--;
}
}
char * convertToTitle(int columnNumber)
{
char* ans = (char*)malloc(sizeof(char) * 8);
int ansSize = 0;
while (columnNumber)
{
--columnNumber;
ans[ansSize++] = columnNumber % 26 + 'A';
columnNumber /= 26;
}
ans[ansSize] = '\0';
Reverse(ans);
return ans;
}
171. Excel 表列序号
原题链接:171. Excel 表列序号
分析
对与字符串,从前往后,每一个权位都比后面的一个字符多了一个26的一次方。 那就拿字符串从后往前计算,每次循环把26的次方都带上。
示例: 若字符串为:“ABCD”; 对应的数字为 [1,2,3,4]
那计算过程就为 : 4×26 ^ 0 + 3×26 ^ 1 + 2×26 ^ 2 + 1×26 ^ 3
代码
int titleToNumber(char * columnTitle)
{
if (NULL == columnTitle)
return 0;
int ans = 0, tmp = 0;
long long secondary = 1;
for (int i = strlen(columnTitle) - 1; i >= 0; --i)
{
tmp = columnTitle[i] - 'A' + 1;
ans += tmp * secondary;
secondary *= 26;
}
return ans;
}
课后习题
LeetCode 483. 最小好进制
原题链接:483. 最小好进制
|