【leetcode热题】Excel表列名称

文章介绍了如何将给定的整数转换为Excel列名称,通过10进制转26进制,利用ASCII码和取余技巧,并修正了当余数为0时的处理方法。

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

例如:

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

示例 1:

输入:columnNumber = 1
输出:"A"

示例 2:

输入:columnNumber = 28
输出:"AB"

示例 3:

输入:columnNumber = 701
输出:"ZY"

示例 4:

输入:columnNumber = 2147483647
输出:"FXSHRXW"

解法一

这道题的话本质上其实就是进制转换,把 10 进制转为 26 进制表示,可以看一下 这篇文章 对进制转换有个更深的了解。

先讨论一下我们熟悉的 10 进制和 16 进制的转换。

16 进制中,0 到 9 还是正常的数字,然后增加字母 A 表示 10,字母 B 表示 11... 以此类推,直到 F 表示 15,所以我们各个位的取值范围是 0 - 15 。

假如 16 的进制的 A1F 转换为 10 进制的话就用下边的式子,其中 A 表示 10, F 表示 15

10×162+1×161+15×160=259110×16​2​​+1×16​1​​+15×16​0​​=2591

对于 10 进制转 26 进制的话是一样的道理,只不过每次采用模 26 和除以 26

所以代码的话,可以直接写出来。

public String convertToTitle(int n) {
    StringBuilder sb = new StringBuilder();
    while (n > 0) {
        int c = n % 26;
        sb.insert(0, (char) ('A' + c - 1));
        n /= 26;
    }
    return sb.toString();
}

上边 (char) ('A' + c - 1) 这里的话,算是一个技巧,我们是通过对 A 的偏移,强制将整数转为了字符。

比如 c = 3,那么 'A' + c - 1,会把 A 根据 ASCII 码值转为 65,然后计算 65 + c - 1 = 65 + 3 - 1 = 67,然后 (char)67,根据 ASCII 码值就刚好是字符 C

但是上边的算法还是有问题的,因为题目中每个位的范围是 1-26,而不是0-25

所以取余的话对于 1-25 的数字结果都是正确的,但如果当前的位是 26,余数求出来就是 0,此时我们需要把它修正为 26

代码修正后如下。

public String convertToTitle(int n) {
    StringBuilder sb = new StringBuilder();
    while (n > 0) {
        int c = n % 26;
        if(c == 0){
            c = 26;
            n -= 1;
        }
        sb.insert(0, (char) ('A' + c - 1));
        n /= 26;
    }
    return sb.toString();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值