OJ练习1——T168
【LeetCode】Excel sheet column title
输入非负整数n,输出以下格式:
1 -> A
2 -> B
......
26 -> Z
27 -> AA
28 -> AB
[分析]实质是将十进制转换为26进制。应该想到用string的+运算,可以连接字符。利用函数reverse(result.begin(),result.end())输出。
对c++语言不熟悉,一开始的做法如下:
class Solution {
public:
string convertToTitle(int n) {
int i,p,q;
vector<char>vec;
for(i=0;i<n;i++){
cout<<i+1<<" "<<"->"<<" ";
p=i/26;
q=i%26;
vec.push_back(q+65);
while(p>0){
q=p%26;
p=p/26;
vec.push_back(q+64);
}
vector<char>::size_type r=vec.size()-1;
while(r>=0&&r<n){
cout<<vec[r];
r--;
}
cout<<endl;
vec.clear();
}
}
};
出现Runtime Error,不能通过。
【错因】
1.OJ平台需要封装成一个类的方法,不应该用for循环打印输出。
2.程序本身有bug,10进制最小数是0,应该对应26进制最小数A,但是题目要求1对应A,那么每个n都应该减去1才能得出正确结果。
3.类中已经提示返回的是string类型,不应该用vector<char>变量。
正确做法是:
class Solution {
public:
string convertToTitle(int n) {
if(n < 1)
return "";
else
{
string result = "";
while(n)
{//get every letter in n from right to left
n --;
char c = n%26 + 'A';
result += c;
n /= 26;
}
reverse(result.begin(), result.end());
return result;
}
}
};
经验证,用string类型的push_back(28ms)要比+运算(4ms)更耗费时间。
浙公网安备 33010602011771号