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
...
Example 1:
Input: 1
Output: "A"
Example 2:
Input: 28
Output: "AB"
Example 3:
Input: 701
Output: "ZY"
写的代码报错之后修改了几下,但还是存在报错:
//感觉就是个26进制与10进制的转换
//'A'+(2-1)=66 这样可以转换数字与字母
class Solution {
public String convertToTitle(int n) {
StringBuilder res = new StringBuilder();
int i=1;
char a;
if(n==0) return "";//返回空字符串可以直接写成""
while(n!=0){
int c=1;
for(int j=i;j>0;j--){
c=c*26;
}
int temp=n%c;
if(temp==0){//报错发现26的余数是0,剩下的是1;应该余1剩0
temp=26;
n=n/c-1;
}
else{n=n/c;}
a = (char)('A'+temp-1);//char+int=int最后的结果是ASII码数值
//int转换成char用(char)强制转换
res.insert(0,a);//insert可以将int、char、string插入字符串的指定位置
i++;
}
String result=res.toString();
return result;
}
}
703/26=27余1,27/26=1余1,但出现了[=91=65+91-1???
最后发现是被除数的地方写错了,第一次除以26,第二次仍应该除以26,而不是26*26。。。
怪不得觉得这个地方写的有些新奇,想一下,十进制的转换一直都是除以10,取剩数余数,二十六进制也是同理。
修改了这个地方之后就好了(原来都想放弃了。。。)
java代码如下:
//感觉就是个26进制与10进制的转换
//'A'+(2-1)=66 这样可以转换数字与字母
class Solution {
public String convertToTitle(int n) {
StringBuilder res = new StringBuilder();//字符串的新建
int i=1;
char a;
if(n==0) return "";//返回空字符串可以直接写成""
while(n!=0){
int c=26;
int temp=n%c;
if(temp==0){//报错发现26的余数是0,剩下的是1;应该余1剩0
temp=26;
n=n/c-1;
}
else{n=n/c;}
a = (char)('A'+temp-1);//char+int=int最后的结果是ASII码数值
//int转换成char用(char)强制转换
res.insert(0,a);//insert可以将int、char、string插入字符串的指定位置
i++;
}
String result=res.toString();//字符串的最终生成
return result;
}
}
这个题在写的过程中遇到了很多很多的问题,不管是设计的逻辑,还是对字符串各种处理的不熟悉。
虽然提交之后运行时间是0ms,但查看了一下最佳代码,发现别人写的好简洁,以后就记住这个写法吧。
最终版:
class Solution {
public String convertToTitle(int n) {
StringBuilder sb=new StringBuilder();
while (n>0) {
n--;//直接n减去1,解决了一切问题,z=26也不会出现剩1余0的现象了。。。
sb.append((char)('A'+n%26));//注意强制转化的写法,是(char)括号在前
n=n/26;
}
return sb.reverse().toString();//先append添加字符,再最后用.reverse()反向,不需要insert那么复杂。。。
}
}
跟别人差距比较大,还是得好好加油啊。