输入一个整数,要求输出对应字母,举例:27输出AA。
题目看起来很简单,我们立马能想到的办法是进行 / % 输出对应结果。
可能很快写出这样的错误代码:
注意A的ascial 是65 小写97 ,此处我们是从64开始添加的。
string numberToSystem26Str(int n) {
string s = string();
int number = n;
while (n>0) {
s = char(n%26+64) +s;
n = n/26;
}
cout<< number << s<<endl;
return s;
}
此时注意: 对于边界情况的考虑,比如26 ,输出就会发生异常,输出A@,很明显不是我们想要的。我们能想到的就是进位的时候对于整数的情况考虑一下。
我们可能会考虑%27 不就是正好了,27 %27 =0 ,会影响我们的输出。最好的办法还是调整一下%26=0,调整对应字母。
然后变成:
对于进位,求下一个大的数我们可能会使用直接/的方法,又会出现问题。
string numberToSystem26Str(int n) {
string s = string();
int number = n;
while (n>0) {
int m = n%26;
if(m==0) m = 26;
s = char(m+64) +s;
n = n/26;
}
cout<< number << s<<endl;
return s;
}
输入26的时候,我们会发现输出AZ,多输出了以为,那怎么样才能规避这个问题呢。 能够%=0,且数值n>0,我们调整一下n的大小。
string numberToSystem26Str(int n) {
string s = string();
int number = n;
while (n>0) {
int m = n%26;
if(m==0) m = 26;
s = char(m+64) +s;
if(m ==26) n=n-1;
n = n/26;
}
cout<< number << s<<endl;
return s;
}
最后给一个精简版的答案。
优化答案
string numberToSystem26Str(int n){
string s = string();
int temp =n;
while (n > 0){
int m = n % 26;
if (m == 0) m = 26;
s = (char)(m + 64) + s;
n = (n-m) / 26;
}
cout<<temp<< s<<endl;
return s;
}
可以看到,题目要求一点都不难,但是需要注意的细节特别多。
%的时候,刚好%=0 的情况
/ 的时候,当%=0, 会不会影响循环条件,是否进行进位。导致输出结果有误。
短短的15分钟面试时间,白板的情况下,考虑所有的边界情况,写出完整的答案,还是非常有难度的,平时要多准备才能以不变应万变。