1.1. 题目

1.1.1. Excel 表列序号

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

示例 4:

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

提示

1 <= columnTitle.length <= 7 columnTitle 仅由大写英文组成 columnTitle 在范围 ["A", "FXSHRXW"] 内




1.1.2. 题解:

  • A是1, Z是26, AA是 26+1, AB是 26+2, 其实仔细想想,我们常用的十进制, 19 +1 = 20, 十位进一,个位归到默认位
  • 所以这个其实就是个26进制

1.1.3. 思路:

  • 既然知道了是26进制,那么现在A代表的是 十进制的1, Z是十进制里的26
  • 常见的 二进制转十进制是怎么转的 比如 100(二进制)转十进制, 12^2 + 02^1 + 0*2^0 = 4
  • 那么26进制 比如 ABC 转成十进制是多少 126^2 + 226^1 + 3*26^0 = 731
  • 那代码怎么写呢
  • 很明显,多少位,就是所在的多少位-1次方, 比如 ABC 是三位,那么就是 A(十进制1) 26的 (三位-1)次方 + B(十进制2) 26的 (二位-1)次方 + C(十进制3)*26(一位-1)次方

1.1.4. 代码:

点击显示
 func titleToNumber(columnTitle string) (res int) {
    // 先将字符串转成切片, 切片的好处是  'A' 是 rune类型, 比如'A' 对应的是 65, 'B'是 66,这样就知道了 'Z'是多少了,可以进行相减操作
    sli := columnTitle[:]
    // 获取切片长度,
    lens := len(columnTitle)
    // 比如 100(二进制) 转成十进制就是 1*2^2 + 0*2^1 + 0*2^0
    // 所以多少次方 是长度减一开始的
    lens--

    // 遍历切片,转成二进制
    for _, v := range sli {
        // 'A' 是1开始的,所以需要加一
        // 后面就是26的多少次方了
        res += int(v-'A'+1) * pow(26, lens)
        // 每挪一位,位数减一
        lens--
    }

    return res
}

// 多少次方的实现, math.Pow 也可以,不过是浮点型的,不想转了
func pow(n, p int) (res int) {
    // 默认值是1, 不然 int默认值是0,那么 0*任何值都是0
    res = 1
    for ; p > 0; p-- {
        res *= n
    }
    return
}

代码

results matching ""

    No results matching ""