leetcode刷题n23-q168:Excel表列名称

·  阅读 341

这是我参与11月更文挑战的第27天,活动详情查看:2021最后一次更文挑战

题目描述

给你一个整数 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"  

提示:

1 <= columnNumber <= 231 - 1

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/ex… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。```

思路 & CODE

1. 26进制运算

第一次遇到这种进制题目,非常神奇

取模和除法运算

[A-Z]对应[1-26],范围相当于是1*26^0 ~ 26 * 26 ^ 0

[AA-ZZ]对应[27-702],范围相当于是26*26^0 + 0*26^1 ~ 26*26^0 + 26*26^1

一个26进制数可以表示为:

a1 * 26^0 + a2 * 26^1 + a3 * 26^2 + ... = n
复制代码

如果对两边进行取模26运算,那么结果就是

n = a1
复制代码

如果对两边进行除法26计算,结果就是:

a2 * 26^0 + a3 * 26^1 + ... = n
复制代码

相当于把这个26进制数往右移一位

本题中只需要不断的取模、除法运算,直到n变为0,就可以得出结果,每次取模得到的结果可以和'A'相加进行位运算,得到相应的字符

特殊处理:减一操作

可以看到题目的数字是从1开始的,那么26个字母的范围就是[1-26],但是26进制的范围是[0-25],我们要避免这种情况,就必须在每次循环的时候把数字减去一。

  • 例子

传入一个数字16,减去一,进行取模运算15 % 26 = 15,接下来进行位运算(char) (15 + 'A'),结果为P,而p对应的数字为16,这里我们加上A这个字符,相当于是给数字又加上了一

public String convertToTitle(int columnNumber) {
    StringBuilder res = new StringBuilder();

    while (columnNumber > 0) {
        columnNumber--;
        int mod = columnNumber % 26;
        res.append((char) (mod + 'A'));
        columnNumber /= 26;
    }
    return res.reverse().toString();
}
复制代码

分类:
后端