进制转换--十进制转二十六进制(力扣168题)

题目:给定一个正整数,返回它在 Excel 表中相对应的列名称。

例如,

1 -> A
2 -> B
3 -> C
...
26 -> Z
27 -> AA
28 -> AB 
...

分析:其实就是一个十进制转换为二十六进制数的问题,只不过是现在需要注意,没有从0开始了,而是从1开始,到26结束,对于1-26以内的数直接利用哈希就可以直接求出来,但是对于大于26的数就需要分开考虑了,即:

  1、大于26,但不是26的倍数,那么就利用常规的“/”和“%”运算就可以求出来,模运算负责求出当前位的数,除法运算负责向前进位

  2、大于26,但是是26的倍数,那么这个就要慎重考虑,不能直接利用上面的运算了,因为是从1开始而不是从0开始的,并且26有实际对应的字母,所以如果出现了26的倍数,那么就在进行除法运算之后,再对n减一,减一是因为当前的低位可以用Z表示一个26,然后剩余减去这一个26之后的值将在高位进行表示。

代码:

 

    public String convertToTitle(int n) {
        char[] map = {'Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
        if (n <= 26){
            return map[n] + "";
        }
        StringBuilder sb = new StringBuilder();
        while (n > 0){

            char c = map[n%26];
            if (n % 26 == 0){
                n /= 26;
                n--;
            }else {
                n /= 26;
            }
            sb.append(c);
        }
        return sb.reverse().toString();
    }

 

posted @ 2020-06-01 21:48  有心有梦  阅读(741)  评论(0编辑  收藏  举报