168. Excel表列名称

2021-06-29 LeetCode每日一题

链接:https://leetcode-cn.com/problems/excel-sheet-column-title/

标签:数学、字符串

题目

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

例如:

A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28 
...
输入:columnNumber = 1
输出:"A"
    
输入:columnNumber = 28
输出:"AB"
    
输入:columnNumber = 701
输出:"ZY"
    
输入:columnNumber = 2147483647
输出:"FXSHRXW"

提示:

  • 1 <= columnNumber <= 231 - 1

题目

这题难点在于找出规律,A - Z分别表示1 - 26, AA表示27,AB表示28,最后你会发现AB -> (B * (26 ^ 0)) + (A * (26 ^ 1)) = 28,其实就是一个26进制数。所以问题就转换为10进制转为26进制,但又和一般得进制转换不一样,因为这里是从1开始的,26结束。

像二进制,范围是[0, 1],八进制范围是[0, 7],16进制范围是[0. 15],这里的26进制范围却是[1, 26]。如果按照一般的进制转换方法去做,对于一些用例是会出错的。所以我们在每次循环的时候,先把该数减1即可。

编码

class Solution {
    /**
     * FXSHRXW
     * (W * (26 ^ 0)) + (X * (26 ^ 1)) + (R * (26 ^ 2)) + (H * (26 ^ 3)) + (S * (26 ^ 4)) + (X * (26 ^ 5)) + (F * (26 ^ 6))
     * 十进制转26进制
     */
    public String convertToTitle(int columnNumber) {
        char[] letters = {‘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‘};
        StringBuilder sb = new StringBuilder();
        while (columnNumber > 0) {
            columnNumber--;
            int remainder = columnNumber % 26;
            sb.append(letters[remainder]);
            columnNumber /= 26;
        }

        return sb.reverse().toString();
    }
}

168. Excel表列名称

168. Excel表列名称

上一篇:记一次vue长列表虚拟滚动内存占用过高问题


下一篇:解决下载vscode速度慢问题