leetcode刷题笔记——Excel列表名称

题目描述:

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

如:

1:A

2:B

28:AB

701:ZY

解题思路:

这道题在leetcode上标注的是简单,所以我本以为它是青铜,完了没想到是个王者。研究了一个上午脑袋都打结了,还是没想明白。看了别人的题解中午睡觉的时候还在寻思,总算是懂得七七八八了。我把代码搬过来,说一下自己的理解(搬的哪位老哥的侵权了的话说一声哈)

AC代码:

public String convertToTitle1(int n){
        String temp = "";
        while (n > 0){
            char s = (char)((n-1) % 26 + 'A');
            temp = s + temp;
            n = (n-1)/26;
        }
        return temp;
    }

一开始以为是一道简单的10进制转换为26进制的问题,然后碰了几次壁之后发现事情没有这么简单。

注意代码中标注的这两个 n-1。

先看第一个n-1,十进制数字1~26对应的是字母A~Z,因此当以A为基点时,数字n=1~26时分别在其上加0-25变成A~Z,因此应该在十进制数的基础上减1再取模。但是也不能写成 char s = (char)(n%26+'A'-1),因为这样写的话,当n被26整除时,本来应该为 ‘Z’,而这样计算得出的会是 ‘A’-1='@'.

至于第二个 n-1,不知道你们有没有注意到这个excel序列和10进制的区别。十进制的个位取满是比十位少1的,就是说个位取满是9,十位为1时代表的是10。而这个excel序列可以出现AZ,A代表一个26,Z也代表一个26,这就很迷了对不对,它这里是满27再进位,但是进的位却代表26。因此为了防止26的倍数,比如说52变成BZ,因为在最末尾已经消耗了一个26,只需要进一个26到前一位。因此第二个 n-1 就是防止这种情况的发生。

其实我觉得归根结底,这道题很迷的原因是它不符合我们的思维惯性。我们的十进制、二进制、十六进制等等每一位都是有0的,而这个excel序列是不存在0的,只有1-26,并且它是满27(而非它的进制26)才向前进一位。

 

转载于:https://www.cnblogs.com/yingying7/p/11578855.html

你可能感兴趣的:(leetcode刷题笔记——Excel列表名称)