给定一个正整数,返回它在 Excel 表中相对应的列名称
如:
1:A
2:B
28:AB
701:ZY
这道题在leetcode上标注的是简单,所以我本以为它是青铜,完了没想到是个王者。研究了一个上午脑袋都打结了,还是没想明白。看了别人的题解中午睡觉的时候还在寻思,总算是懂得七七八八了。我把代码搬过来,说一下自己的理解(搬的哪位老哥的侵权了的话说一声哈)
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