Leetcode: 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
这道题是我微软onsite时遇到的一道题,没做过遇到这道题确实有点难一下子理得很清楚(我当时这道题应该做的不好,从most significant digit做,而且忘了n要-1)。这道题说白了其实就是十进制转换26进制,而且是从1开始的1十进制的转换
短除法: Short Division
本质是进制转换,将n转化为26进制,转化过程如下(括号里的是26进制数):
1->(1)->A
2->(2)->B
...
26->(10)->Z
27->(11)->AA
28->(12)->AB
.....
52->(20)->AZ
53->(21)->BA
从least significant digit开始,不断地除以26取余数
这是我的方法:因为A是1,而不是0,相当于26进制的数都整体减1,才能对应上从0开始的十进制数。
1 public class Solution { 2 public String convertToTitle(int n) { 3 if (n <= 0) return ""; 4 StringBuffer res = new StringBuffer(); 5 while (n > 0) { 6 res.insert(0, (char)('A' + (n-1)%26)); 7 n = (n-1) / 26; 8 } 9 return res.toString(); 10 } 11 }
这道题首先因为26个数字为一组,26次变一次,所以肯定是26进制,如果是1-26, 那么26号数字没法跟前面保持一致,比如都是一位25/26=0 而26/26=1. 所以应该回归0-based,1-26各数减一变成0-25,对应A到Z。但新的问题又出现了:AA本来是27,减了一之后是26, 26%26==0,最后一位是A没错,但是前一位26/26 == 1,又对应A,刚才0才对应A来着。所以,每一循环都要减一,以确保是0-based
另一种做法:
1 public String convertToTitle(int n) { 2 if(n <= 0){ 3 throw new IllegalArgumentException("Input is not valid!"); 4 } 5 6 StringBuilder sb = new StringBuilder(); 7 8 while(n > 0){ 9 n--; 10 char ch = (char) (n % 26 + 'A'); 11 n /= 26; 12 sb.append(ch); 13 } 14 15 sb.reverse(); 16 return sb.toString(); 17 }