Excel表列名称

一、需求

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

例如,

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

示例 1:

输入: 1
输出: "A"

示例 2:

输入: 28
输出: "AB"

示例 3:

输入: 701
输出: "ZY"

二、进制转换法

2.1  思路分析

  1. 我们将A~Z类比成16进制中的A~F,那么A~Z表示的就是数字1~26,而题目的意思就是将十进制数转换成A~Z表示的26进制,我们用 x_i 来表示26进制的第 i 位,那么有:
  2. 一般表达式:......+x_4*26^3+x_3*26^2+x_2*26^1+x_1*26^0=n,此时 x_i 的范围是 1~26 ,因此要求 x1,若等式两边对26求余是无法得到x1的,为了解决这个问题,可以将等式两边同时减1,这样就得到......+x_4*26^3+x_3*26^2+x_2*26^1+(x_1-1)*26^0=n-1,这样x1 - 1的范围就是 0~25,等式两边对26求余即可得到x1,即x1=(n-1) % 26 + 1;
  3. 同样,为了方便求x2,等式两边同时除26,即可消掉x1,因此x2,x3等的求法即重复2,3;

2.2  代码实现

class Solution {
    public String convertToTitle(int n) {
        StringBuilder sb = new StringBuilder();
        while(n > 0) {
            n--;
            //这里将'A'看作1
            sb.append((char)(n % 26 + 'A'));
            n = n / 26;
        }
        sb.reverse();
        return sb.toString();
    }
}

2.3  复杂度分析

  • 时间复杂度为O(log_{26}N),将十进制转换成26进制;
  • 空间复杂度为O(1),返回值不计入额外空间;

三、学习地址

作者:windliang

链接:https://leetcode-cn.com/problems/excel-sheet-column-title/solution/xiang-xi-tong-su-de-si-lu-fen-xi-by-windliang-2/

猜你喜欢

转载自blog.csdn.net/Sruggle/article/details/113698482
今日推荐