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
}