题目:
Given a positive integer, return its corresponding column title as appear in an Excel sheet.
思路:
乍眼一看,好像和求26进制数字是一样的,但其实错了,这个题目与求26进制数字是不一样的,区别在于:
- 26进制数字:个位的取值范围是[0~25],其他高位的取值范围也是[0~25],所有位的取值范围都是一致的。
- 此题目:个位的取值范围是[‘A’~‘Z’],但其他高位的取值范围并不是[‘A’~‘Z’]。假设数字[0~25]映射到[‘A’~‘Z’],可以想象一下,个位数如果是0,则对应的是’A’字符;但高位数如果是1,才对应字符’A’。实际上错开了一位。
还有个小细节在代码注释中有讲。
代码实现:
class Solution {
public:
string convertToTitle(int n) {
vector<char> my_hash(26,0);
for (int i = 0; i < 26; ++i){
my_hash[i] = i + 'A';
}
int times = n;
int remain;
string ret;
do{
--times; // 决定成败的小细节,每次求出倍数是从1开始算的,我们要求是从0开始算,所以减去1。
/*
举个小例子:假设times = 26(remain,从1开始算)+26,--times相当于变成了25(remain,从0开始算)+26,相当于只改变余数部分,后面的times/26会直接把remain部分去除掉。
*/
remain = times % 26;
ret = my_hash[remain] + ret;
times = times / 26;
}while (times);
return ret;
}
};
discuss:
class Solution {
public:
string convertToTitle(int n) {
string res;
char tmp;
while (n){
n -= 1; // 必须减1,很关键
tmp = 'A' + n % 26;
res = tmp + res;
n /= 26
}
}
};