• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
neverlandly
博客园    首页    新随笔    联系   管理    订阅  订阅

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 }

 

posted @ 2014-12-23 12:43  neverlandly  阅读(2626)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3