题目描述如下
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
题目理解:
就是一个26进制问题,但此时A对应的是1,Z对应的是26,即26进制是1-26,而非0-25;
// 自己写的代码
import java.util.*;
class Solution {
public String convertToTitle(int n) {
String result = "";
int m = 1;
// ‘A’的ascii码为65
Map<Integer,String> map = new HashMap<Integer,String>();
for(int i = 65; i < 91; i++ ){
map.put(m,Character.toString((char)i)); // 在map中(1,“A”),(2,“B”)......(26,"Z")
m++;
}
int g = 1; // 余数,1是随便设值
while( n > 0){ // 进制转换,循环取余法
g = n%26;
if(g == 0) { // 如果余数判断为0
result += map.get(26); // 则返回的是“Z”,因为get(0)此时没有对应
n /= 26;
n = n-1; // 此时余数0返回的是26,则被除数应该借走一位
}
else {
result += map.get(g);
n /= 26; // 无需借位
}
}
System.out.print(result.length());
return reverse(result); // 放的时候倒着放的,需要反转字符串
}
public String reverse(String str) { // 反转字符串
if (str == null || str.length() <= 1) {
return str;
}
StringBuffer sb = new StringBuffer(str);
sb = sb.reverse();
return sb.toString();
}
}
循环取余代码理解:
比如"1555=BGU =(BG)*26+U =((B*26)+G)*26+U"
则:1555/26 = 59····21 则余数为21,对应U,59对应(B*26)+G
59/26 = 2····7 则余数为7,对应G,2对应B
2/26 = 0····2 则余数为2,对应B
// 别人的代码
class Solution {
public String convertToTitle(int n) {
StringBuilder sb = new StringBuilder();
while(n>0){
n--; // 因为一直是从‘A’开始,所有n要自减1
sb.insert(0,(char)('A'+n%26)); // 插入字符时一直从index为0的地方开始,所以无需反转
n=n/26;
}
return sb.toString();
}
}
网友评论