百度面试了一道题:
在Excel中,列的名称是这样一个递增序列:seq={A、B、C、... Z、AA、AB、AC、... AZ、BA、BB、BC、... BZ、CA、... ZZ、AAA、AAB...}。求给出任意一个序列,求这个序列是第几个字符串。
这个问题我只想到了到了大体思路,代码没有写出来,最最关键的是看出这个问题背后的意义,代码也就不是问题了,我当时的思路就是为了解题而解题了,没想到这道题考的是什么。
这道题的意义就是26进制的数,将A~Z的字母换成0~25就是相应的26进制数字,所以给定一个整数n,求这个序列里
的第n个字符串,也就是给出十进制求26进制问题,例如:ABC=A*(10^2)+B*(10^1)+C
相应的代码为:
std::string Convert10To26(int n){
if(n <= 0)
return "";
int m = n;
int rm = 0;
std::string alphaB="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
std::string res;
while (m){
rm = (m -1) % 26;
m = (m -1) / 26;
res.push_back(alphaB[rm]);
}
std::reverse(res.begin(), res.end());
return res;
}
参考:
http://blog.youkuaiyun.com/duxinyuhi/article/details/53326077
相似问题有字符串的全排列和组合问题
https://segmentfault.com/a/1190000002710424
http://blog.youkuaiyun.com/sjpz0124/article/details/46640761
https://www.jianshu.com/p/f051a4ae6e93
void SwapString(std::string &orgName, int b, int e){
char t = orgName[b];
orgName[b] = orgName[e] ;
orgName[e] = t;
}
void permutation(std::string &orgName,int begin,int end){
if (begin == end ) {
std::cout << orgName << std::endl;
}
else {
for (int k = begin; k <= end; k++) {
SwapString(orgName, k, begin);
permutation(orgName, begin + 1, end);
SwapString(orgName, k, begin);
}
}
}