leetcode:168. Excel表列名称

题目

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

  1. A -> 1
  2. B -> 2
  3. C -> 3
  4. ...
  5. Z -> 26
  6. AA -> 27
  7. AB -> 28
  8. ...

示例:

  1. 输入:columnNumber = 1
  2. 输出:"A"
  1. 输入:columnNumber = 28
  2. 输出:"AB"
  1. 输入:columnNumber = 701
  2. 输出:"ZY"
  1. 输入:columnNumber = 2147483647
  2. 输出:"FXSHRXW"

解答 & 代码

其实就类似于十进制数 num 取每一位的值:

  • 从最低位开始取,每一位等于 num % 10,然后令 num = num / 10,接着循环取下一位(更高的一位)
  • 最终将位次逆序,就得到了高位到低位的每一位

而这里的区别就两点:

  1. 这里是 26 进制,因此取每一位是 num % 26,然后令 num = num / 26
  2. 这里 26 进制的范围是 1~26,而不是 0~25,因此每一位应该是 (**num - 1**) % 26 + 'A'
    1. class Solution {
    2. public:
    3. string convertToTitle(int columnNumber) {
    4. string result = ""; // 结果字符串
    5. // 将数字转换为 26 进制,从右往左(从低位到高位)得到每一位
    6. while(columnNumber > 0)
    7. {
    8. // 注意这里要先将数值 -1!!!,因为这类 26 进制是 1~26,而不是 0~25
    9. --columnNumber;
    10. result += columnNumber % 26 + 'A'; // 取余得到当前位
    11. columnNumber /= 26; // 除 26
    12. }
    13. // 将结果逆序
    14. reverse(result.begin(), result.end());
    15. return result;
    16. }
    17. };
    复杂度分析:设整数 n
  • 时间复杂度[简单] 168. Excel表列名称 - 图1
  • 空间复杂度 O(1):结果字符串不计入

执行结果:

  1. 执行结果:通过
  2. 执行用时:0 ms, 在所有 C++ 提交中击败了 100.00% 的用户
  3. 内存消耗:5.7 MB, 在所有 C++ 提交中击败了 75.33% 的用户