题目描述:
168. Excel Sheet Column Title
Given a positive integer, return its corresponding column title as appear in an Excel sheet.
For example:
1 -> A 2 -> B 3 -> C ... 26 -> Z 27 -> AA 28 -> AB
解题思路:
面对这道题时,第一次的想法相对比较简单,就是在“A”的基础上逐渐累加,然后得到结果。(如代码1)但是这种方法效率极低,在n特别大的时候会超时。发现效率太低之后,我尝试使用计算方法,而不是逐个累加。首先令tag标记为26,如果26*27>=n>26,则结果中字符串长度即为2,以后的情况类似。
通过这种方法首先确定了结果中字符串的长度,之后再将tag逐渐递减,对应相应字符的变化,当n等于0时即得到结果。(正确解法见代码2)
代码展示:
<pre name="code" class="cpp">class Solution {
public:
//代码一
// Time Limit Exceed
string convertToTitle(int n) {
string ans ="A";
int ssize = ans.size();
for(int i=1;i<n;i++)
{
int t = ssize-1;
while(ans[t]=='Z')
{
t--;
}
if(t==-1)
{
for(int i=0;i<ans.size();i++)
{
ans[i]='A';
}
ans = 'A'+ans;
ssize+=1;
}
else
{
ans[t]=char(ans[t]+1);
for(int i=t+1;i<ssize;i++)
ans[i]='A';
}
//cout<<ans<<endl;
}
return ans;
}
};
<pre name="code" class="cpp">class Solution {
public:
//代码二
//accepted
string convertToTitle(int n) {
long long tag =26;
string ans ="A";
while(n-tag>0)
{
n-=tag;
tag*=26;
ans+="A";
}
int num_pow =1;
while(n>0)
{
while(n-tag/pow(26,num_pow)>0)
{
ans[num_pow-1]=char(ans[num_pow-1]+1);
n-=tag/pow(26,num_pow);
//cout<<n<<" "<<ans<<endl;
}
num_pow++;
}
return ans;
}
};