文章参考自:英雄哪里出来
原题链接: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 表列序号
对与字符串,从前往后,每一个权位都比后面的一个字符多了一个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; }
原题链接:483. 最小好进制