刷题打卡:字符串操作のExcel表列名称两道题

122 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

一、题目描述:

Excel表列名称

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

例如:

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

输入:columnNumber = 1
输出:"A"

示例 2:

输入:columnNumber = 28
输出:"AB"

示例 3:

输入:columnNumber = 701
输出:"ZY"

示例 4:

输入:columnNumber = 2147483647
输出:"FXSHRXW"

二、思路与实现:

思路:

  • 先取余数,然后余数 + 64 获得字符(不是+65的原因是题目的A从1开始,要减去1)
  • 然后减去余数再除26,刚好除得尽,新的一位开始

代码实现:

/**
 * @param {number} columnNumber
 * @return {string}
 */
var convertToTitle = function(n) {
    if (n <= 0) return "";
    let res = [];
    while(n) {
      let remain = n % 26 ? n % 26 : 26; // 类似 十进制的 521 进行不断取余
      res.unshift(String.fromCharCode(remain + 64)); // 然后余数 + 64 获得字符(不是+65的原因是题目的A从1开始,要减去1)
      n = Math.floor((n - remain) / 26); // 然后减去余数再除26,刚好除得尽,新的一位开始
    }
    return res.join("");
};

三、总结:

这个题还可以反过来问:

给你一个字符串 columnTitle ,表示 Excel 表格中的列名称。返回 该列名称对应的列序号。

示例 1:

输入: columnTitle = "A"
输出: 1

示例 2:

输入: columnTitle = "AB"
输出: 28

示例 3:

输入: columnTitle = "ZY"
输出: 701

JS 实现:

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
};

时间复杂度:O(n),其中 nn 是列名称 columnTitle 的长度。需要遍历列名称一次。

空间复杂度:O(1)。

这两题都相较基础,继续加油~~