yxym2016

题目:给定一个正整数,返回它在 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();
    }

 

分类:

技术点:

相关文章: