「前端刷题」171.Excel 表列序号(EASY)

138 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情

题目(Excel Sheet Column Number)

链接:https://leetcode-cn.com/problems/excel-sheet-column-number
解决数:1126
通过率:71.6%
标签:数学 字符串 
相关公司:microsoft google amazon 

给你一个字符串 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"] 内

思路

1.建立字符对应数值字典(A:1, B:2, C:3.....Z:26) 2.从后往前遍历字符串,计算每一位的值 // (因为要确定当前字符所处的位数:个位,十位,百位....需要成不同倍数,所以从后往前取)

代码

/**
 * @param {string} columnTitle
 * @return {number}
 */
var titleToNumber = function(columnTitle) {
    const startCode = 'A'.charCodeAt();
    let strMap = {};
    let result = 0;
    for(let i=0; i<26; i++) {
        const key = String.fromCharCode(startCode+i);
        strMap[key] = i+1;
    }
    const len = columnTitle.length-1;
    for(let i=len; i>=0; i--) {
        result += Math.pow(26, len-i) * strMap[columnTitle[i]]
    }
    return result
};

思路2

1.先反转; 2.每位上的计算方式为:26的位次幂 * 当前位上的字母所代表的数字; 3.最后累加。

代码

/**
 * @param {string} columnTitle
 * @return {number}
 */
var titleToNumber = function(columnTitle) {
  let char = columnTitle.split('').reverse(); // 先反转
  let sum = 0;

  char.map((item,index) => {
    sum += (item.charCodeAt() - 64) * Math.pow(26, index);
  })

  return sum;
};

思路3

遍历每个位置:strCode * 26 ** 当前位置距离末尾的距离

代码

/**
 * @param {string} columnTitle
 * @return {number}
 */
var titleToNumber = function(columnTitle) {
    let len = columnTitle.length
    let i = 0
    let sum = 0
    while(i < len) {
        sum += (columnTitle.charCodeAt(i) - 64) * 26 ** (len - i++ - 1)
    }

    return sum
};

思路4

  1. 从末尾开始取得每一个字符对应的数cur = c.charCodeAt() - 64
  2. 数字总和sum += 当前数 * 进制位数
  3. 进制位数 *= 26,初始化进制位数carry = 1

代码

var titleToNumber = function(s) {
    let sum = 0, i = s.length - 1, carry = 1;

    while (i >= 0) {
        let cur = s[i].charCodeAt() - 64;

        sum += cur * carry;
        carry *= 26;
        i--;
    }

    return sum;
};

思路5

利用Unicode码,计算26进制

代码

function titleToNumber(columnTitle: string): number {
  // 所以这就是个26进制?
  // 我们都知道A的Unicode码是65 这样所有的字母取码后-64即其所代表的数字,然后与其所在位数关联后相加即可
  let len = columnTitle.length,
    resNum = 0
  for (let z = 0; z < len; z++) {
    resNum += (columnTitle[z].charCodeAt(0) - 64) * (26 ** (len - 1 - z))
  }
  return resNum
};