LeetCode 168. Excel Sheet Column Title【数学/字符串】简单

本文介绍了一种算法,用于将Excel表格中的列号转换为对应的列名称,例如从数字27转换为AA。该算法通过一种特殊的进制转换实现,详细解释了转换过程并提供了C++代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given an integer columnNumber, return its corresponding column title as it appears in an Excel sheet.

For example:

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

Example 1:

Input: columnNumber = 1
Output: "A"

Example 2:

Input: columnNumber = 28
Output: "AB" 

Example 3:

Input: columnNumber = 701
Output: "ZY"

Example 4:

Input: columnNumber = 2147483647
Output: "FXSHRXW"

Constraints:

  • 1 <= columnNumber <= 231 - 1

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


解法 进制转换

有些类似于十进制到二十六进制的转换,不过也有不同,比如 A -> Z 对应的是 1 -> 26 ,而 27 对应的是 AA 。假设给出的整数是 nnn ,对应的列名称为 akak−1…a1a0, ai∈[A, Z]a_{k} a_{k-1}\dots a_1a_0,\ a_i \in \text{[A, Z]}akak1a1a0, ai[A, Z] ,字符 aia_iai 对应到数字 (ai−A+1)∈[1,26](a_i - A + 1) \in [1, 26](aiA+1)[1,26] ,于是转换规律如下:
(ak−A+1)×26k−1+⋯+(a1−A+1)×26+(a0−A+1)=n(a_k - A + 1) \times 26^{k-1} + \dots + (a_1 - A + 1) \times 26 + (a_0 - A + 1) = n(akA+1)×26k1++(a1A+1)×26+(a0A+1)=n

因此等式左右两边同时减去 111 ,结果为:
(ak−A+1)×26k−1+⋯+(a1−A+1)×26+(a0−A)=n−1(a_k - A + 1) \times 26^{k-1} + \dots + (a_1 - A + 1) \times 26 + (a_0 - A) = n - 1(akA+1)×26k1++(a1A+1)×26+(a0A)=n1

此时 (a0−A)∈[0,25](a_0 - A) \in [0, 25](a0A)[0,25] ,通过对 n−1n - 1n1262626 即可得到 (a0−A)(a_0 - A)(a0A) ,即有 a0=(n−1) % 26+Aa_0 = (n - 1)\ \% \ 26 + Aa0=(n1) % 26+A 。接着令 n−1n - 1n1 除以 262626 得到下式,继续重复前面的步骤直到求出 aka_kak
(ak−A+1)×26k−2+⋯+(a1−A+1)=(n−1)×26−1(a_k - A + 1) \times 26^{k-2} + \dots + (a_1 - A + 1) = (n - 1) \times 26^{-1}(akA+1)×26k2++(a1A+1)=(n1)×261

对应的代码如下:

class Solution {
public:
    string convertToTitle(int columnNumber) {
        string ans;
        do { 
            ans.push_back('A' + (--columnNumber % 26));
            columnNumber /= 26;
        } while (columnNumber);
        reverse(ans.begin(), ans.end());
        return ans;
    }
};

运行效率如下:

执行用时:0 ms, 在所有 C++ 提交中击败了100.00% 的用户
内存消耗:5.7 MB, 在所有 C++ 提交中击败了82.75% 的用户
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

memcpy0

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

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

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

打赏作者

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

抵扣说明:

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

余额充值