前端算法-Excel表的列名称

136 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第17天,点击查看活动详情

题目

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

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

思路一

我们先定义一个arr数组并将26个字母放入,我们为了计算方便,在头部额外加个Z,因为数组的下标是从0开始的,然后进行判断如果当前形参n小于等于26则直接返回对应的arr数组的n位置元素,在声明一个i变量记录余数字符,声明一个str变量记录字符串,在使用循环,进行循环当前形参n大于26的情况,在循环中,我们更新i变量和n变量以及str变量,最后n形参肯定是小于26的,所以我们将其对应于数组中的字符添加到str字符串的头部并返回出去

/**
 * @param {number} n
 * @return {string}
 */
var convertToTitle = function(n) {
    let arr = ['Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];
    if(n<=26){
        return arr[n]
    }
    let i = ''
    let str = ''
    while(n>26){
        i = a[n%26]
        n = Math.ceil(n/26)-1
        str = i + str
    }
    str = arr[n] + str
    return str
};

思路二

我们先声明一个res变量用于存放结果,在声明一个Map数据结构,将26个字符全部放进去,然后使用循环进行判断当前columnNumber形参是否大于0,如果是则使用用余数取字符,并赋值给cur变量,在将其添加到res变量的头部,最后使用Math.floor更新columnNumber形参值,最后使用join方法把res数组转换成字符串并返回出去

/**
 * @param {number} columnNumber
 * @return {string}
 */
var convertToTitle = function(columnNumber) {
    let res = [];
    let map = new Map([[1,"A"], [2,"B"], [3,"C"], [4,"D"], [5,"E"], [6,"F"], [7,"G"], [8,"H"], [9,"I"], [10,"J"], [11,"K"], [12,"L"], [13,"M"], [14,"N"], [15,"O"], [16,"P"], [17,"Q"], [18,"R"], [19,"S"], [20,"T"], [21,"U"], [22,"V"], [23,"W"], [24,"X"], [25,"Y"], [26,"Z"]]);
    while(columnNumber > 0){
        let cur = columnNumber % 26 ? columnNumber % 26 : 26;
        res.unshift(map.get(cur));
        columnNumber = Math.floor((columnNumber - cur) / 26);
    }
    return res.join("");
};