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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM