Leetcode-Excel表列名称 E[168]

一、问题

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

        示例1:

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

        示例2:

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

        示例3:

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

        示例4:

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

        提示:

                ·  1 <= columnNumber <= 231 - 1

 二、思路和方法

        根据题目:A表示1,B表示2...Z表示26,可以看出表中对应的列名称的规律是:26进1。我们可以根据此规律来解决问题。但是这条规律又与进制的表示方法有所不同,进制的每一位的数字最小可以表示为0,但是列名称的最小值为 ’A‘(1)。我们需要根据情况解决问题。

        首先,我们使用 除26取余法将给定数字 columnNumber 的26进制获取,然后根据每一位上是为0来向跟高位进行借位,然后转换为字符串就可以得到Excel 表的列名称。

        上面这个方法需要使用三步才能得到我们想要的数据,我们可以将其优化:

        使用一个StringBulider来存储列名称,每次循环都将最后一位列名称加入集合。在进制转换之前,我们需要对 columnNumber 进行 -1 操作,以达到 整体偏移

举个例子:

        columnNumber :52 -> AZ

        我们正常计算得到的26进制数:2 0  ,得到的结果显然不符合期望值;我们对其 -1 操作

      得到:1 25 -> AY,这也不符合期望的数据,但是我们在进行存储的时候采取的是 'A' + index  的方式来存储数据,'A'本身代表1,所以这样的方式可以得到我们期望的结果。

三、代码

        /* 1 */
        List<Integer> list = new ArrayList<>();
        StringBuilder builder = new StringBuilder();
        int x = 1;
        int y;
        while (x != 0) {
            x = columnNumber / 26;
            y = columnNumber % 26;
            columnNumber = x;
            list.add(y);
        }
        int len = list.size();
        for (int i = 0;i < len - 1; i++) {
            if (list.get(i) == 0) {
                list.set(i, 26);
                list.set(i + 1, list.get(i + 1) - 1);
            }
        }
        for (int i = list.size() - 1; i >= 0; i--) {
            if (list.get(i) != 0) {
                char a = (char) ('A' + list.get(i) - 1);
                builder.append(a);
            }
        }
        return builder.toString();
    /* 2 */
    public String convertToTitle(int columnNumber) {
        StringBuilder builder = new StringBuilder();
        while (columnNumber > 0) {
            columnNumber--;
            builder.append((char) ('A' + columnNumber % 26));
            columnNumber /= 26;
        }
        return builder.reverse().toString();
    }

四、执行结果 

 info1
            解答成功:
            执行耗时:0 ms,击败了100.00% 的Java用户
            内存消耗:35.6 MB,击败了39.21% 的Java用户

info2
            解答成功:
            执行耗时:0 ms,击败了100.00% 的Java用户
            内存消耗:35.5 MB,击败了62.64% 的Java用户 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

最向往的地方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值