👨🎓作者:bug菌 ✏️博客:CSDN、掘金等 💌公众号:猿圈奇妙屋 🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。 🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。
题目:
给你一个字符串
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"] 内
题目来源:LeetCode原题地址 题目难度:⭐⭐
《168. Excel表列名称》,它是给你一个整数 columnNumber ,然后返回它在 Excel 表中相对应的列名称,而这道题是它的逆向衍生题,给你excel表中的列名称,要你返回所对应的列序号。
具体如何实现啊?这里我提供两种思路。具体如下:
思路1:
模拟法,首先我们将这个columnTitle
看成是一个26进制数,然后再将这个26进制的数转为10进制数! 就和简单2进制,5进制,16进制转10进制原理一样!所以这里提前将A-Z代表什么数用数组存储起来!方便你对应。
思路2:
我们先初始化结果ans = 0,然后对columnTitle进行遍历,在
遍历时将每个字母都与 A 做减法,因为 A 表示 1,所以对其减法后都需要每个数再加 1,所以计算其字母代表的数值为 num = [字母 - ‘A’ + 1],因为有 26 个字母,就相当于 26 进制,每 26 个数则向前进一位(逢26进1),所以每遍历一位则ans = ans * 26 + num,以 AAA 为例,最右边的A =1,AA=26*1+1,AAA =A*(AA) = 26 * (26*1+1)+ 1=703。
模拟法-AC代码:
具体算法代码实现如下:
class Solution1 {
public int titleToNumber(String columnTitle) {
int[] nums = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26};
int length = columnTitle.length();
int ans = 0;
for (int i = length - 1, j = 0; i >= 0 && j < length; i--, j++) {
int num = nums[columnTitle.charAt(i) - 'A'];
ans += num * Math.pow(26, j);
}
return
内置位计数法-AC代码:
具体算法代码实现如下:
class Solution2 {
public int titleToNumber(String columnTitle) {
int ans = 0;
for(int i=0;i<columnTitle.length();i++) {
int num = columnTitle.charAt(i) - 'A' + 1;
ans = ans * 26 + num;
}
return
进制转换法-leetcode提交运行结果截图如下:
复杂度分析:
进制转换法-leetcode提交运行结果截图如下:
复杂度分析:
总结一下:这道题其实考的就是你们对进制转换熟不熟悉,本质就是26进制转换,比如A就是1,那AA呢?不就是1*26+1嘛,那AAA呢?不就是 26 * (26*1+1)+ 1,再比如'BC',c = 3,B=2所以'BC' = 26*(2)+3 = 55;这样你们明白了么?你们就当成进制转换题,无非就是有点拗口,无非就是十进制题,只不过这道题它是由指定字母来代替,比如1=A,2=B,这样子,比如55转换成26进制,不就等于55/26 = 2...3对应起来不就是‘BC’,我这样总结,你们是不是就能理解了。所以相对而言这道题就是纯粹考进制转化。
再者,解题道路千万条,欢迎小伙伴们脑洞大开,如果你们有啥更好的想法或者思路,欢迎评论区告诉我哦,大家一起互相借鉴互相学习,方能成长的更快。
好啦,以上就是本期的所有内容啦,咱们下期见咯。