leetcode
leetcode 151 ~ 200
Excel表列名称

Excel表列名称

难度:

标签:

题目描述

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

代码结果

运行时间: 13 ms, 内存: 16.0 MB


// Solution in Java using Java Stream
// Problem: Convert a given column number to its corresponding Excel column name.
// Approach: Similar to the basic Java solution but demonstrates a more functional approach using streams and StringBuilder.
// Note: This problem doesn't inherently benefit much from Stream API, but we use it to showcase a different style.
 
import java.util.stream.IntStream;
 
public class SolutionStream {
    public String convertToTitle(int columnNumber) {
        StringBuilder result = new StringBuilder();
        IntStream.iterate(columnNumber, num -> num > 0, num -> (num - 1) / 26)
                .forEach(num -> result.append((char) ((num - 1) % 26 + 'A')));
        return result.reverse().toString(); // Reverse to get the correct column title
    }
}

解释

方法:

这个题解使用了类似进制转换的思想。首先将给定的列号不断对26取模,得到各位的数字(实际对应字母的ASCII码),然后将列号整除26。重复该过程直到列号小于等于26。最后将得到的各位数字根据ASCII码转换为对应的字母,即可得到Excel表列名称。需要注意的是,由于Excel表列名称中不存在数字0,因此在每次取模后需要特殊处理余数为0的情况。

时间复杂度:

O(log n)

空间复杂度:

O(log n)

代码细节讲解

🦆
在处理Excel列编码时,为什么在余数为0时,需要特别将columnNumber减1再继续处理?
在Excel列编码中,是一个从1开始的26进制系统,没有0这个数字。通常,当一个数在传统的26进制中被26整除时,余数是0。但在Excel列名中,当出现余数为0时,实际上应该表示为'Z',而不是像传统26进制那样可以直接置为0并进位。因此,我们必须将columnNumber减1,以正确地处理这种情况。这样可以把'Z'当作26处理(即A=1, B=2, ..., Z=26),然后减1之后再整除26,确保下一轮计算时位数能正确下降。
🦆
在循环中,每次都是对26取模,这种方法是否能保证所有大于26的数都能正确转换成Excel列名?
是的,这种方法能够确保所有大于26的数都能正确转换成Excel列名。这个算法实际上是模仿了26进制的转换,但特别处理了余数为0的情况。通过不断对26取模来确定每个位置上的字母,然后通过整除26减少columnNumber的大小,可以保证最终将任何大于26的数转换成正确的Excel列名。
🦆
你如何处理columnNumber正好等于26的情况,为什么在最后还需要单独处理最高位数字?
当columnNumber正好等于26时,按照算法首先会对26取模,结果为0,并且columnNumber将变为0(26/26-1=0)。这意味着最终的结果应该是'Z'。对于最后单独处理最高位数字的原因是,循环结束时,可能会剩下一个不足以再次整除26的数字,这个数字需要直接转换成对应的字母,并且加到结果的最前面。这步骤是必要的,因为最高位在循环中未被处理,循环只处理除最高位以外的其他位。
🦆
在将数字转换为对应的ASCII字符时,使用的是`chr(temp + 64)`,为什么选用64作为基准数字?
在ASCII编码中,大写字母'A'的ASCII码是65。因此,当我们使用`chr(temp + 64)`的方式时,实际上是将1-26的数字转换成'A'到'Z'。例如,如果temp是1,则`chr(1+64)`就是`chr(65)`,即'A';如果temp是26,则`chr(26+64)`就是`chr(90)`,即'Z'。这种转换是基于ASCII值的计算,保证了数字能正确转换为对应的大写字母。

相关问题

Excel 表列序号

给你一个字符串 columnTitle ,表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。

例如:

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

 

示例 1:

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

示例 2:

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

示例 3:

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

 

提示:

  • 1 <= columnTitle.length <= 7
  • columnTitle 仅由大写英文组成
  • columnTitle 在范围 ["A", "FXSHRXW"]