zl程序教程

您现在的位置是:首页 >  后端

当前栏目

LeetCode-171. Excel 表列序号(java)

JAVALeetCodeExcel 序号 表列
2023-09-27 14:28:25 时间

一、前言🔥

👨‍🎓作者:bug菌

✏️博客:CSDN掘金

💌公众号:猿圈奇妙屋

🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。

🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。

       哈喽,小伙伴们,我是bug菌呀👀。由于上海这波疫情,导致很多小伙伴扛不住降薪打击而选择离开自己的上家,借此, 对于没有工作或者即将失业要重新面试的小伙伴而言,bug菌想接着把上几个月更新的专栏《每日一题LeetCode》给重新捯饬起来,只为帮助小伙伴们,能顺利上岸,收到自己心仪的offer,面试第一关, 就是算法题。因为我始终坚信,变强绝对不是一朝一夕,而是贵在长久坚持,持之以恒。所以,赶紧跟着bug菌的步伐卷起来吧⏰,变强从这一刻开始➕🧈。

       小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐️+关注👨‍🎓+留言📃)就是对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 ans;
            }
        }

内置位计数法-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 ans;
        }
}

五、总结🔥

进制转换法-leetcode提交运行结果截图如下:

  

 复杂度分析:

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

进制转换法-leetcode提交运行结果截图如下:

 复杂度分析:

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

       总结一下:这道题其实考的就是你们对进制转换熟不熟悉,本质就是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’,我这样总结,你们是不是就能理解了。所以相对而言这道题就是纯粹考进制转化。

       再者,解题道路千万条,欢迎小伙伴们脑洞大开,如果你们有啥更好的想法或者思路,欢迎评论区告诉我哦,大家一起互相借鉴互相学习,方能成长的更快。

       好啦,以上就是本期的所有内容啦,咱们下期见咯。

  六、热门推荐🔥

  1. leetcode-9.回文数
  2. leetcode-1.两数之和
  3. leetcode-13.罗马数字转整数
  4. leetcode-14.最长公共前缀
  5. leetcode-20.有效的括号
  6. leetcode-21.合并两个有序链表
  7. leetcode-26. 删除有序数组中的重复项

七、文末🔥

        如果你还想要学习更多,小伙伴们大可关注bug菌专门为你们创建的专栏《每日一题LeetCode》,带着你一块儿刷题,专栏每一篇都附带详细解法,手把手带你解题。

        一个人刷可能会觉得很累很难坚持,但是一群人刷就会觉得它是一件很有意义的事儿,互相督促互相鼓励,一起变强。

       我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!

最后送大家两句话,与诸君共勉!


☘️做你想做的人,没有时间限制,只要愿意,什么时候都可以start,

🍀你能从现在开始改变,也可以一成不变,这件事,没有规矩可言,你可以活出最精彩的自己。


​​

💌如果文章对您有所帮助,就请留下您的吧!(#^.^#);

💝如果喜欢bug菌分享的文章,就请给bug菌点个关注吧!(๑′ᴗ‵๑)づ╭❤~;

💗如果对文章有任何疑问,还请文末留言或者加群吧【QQ交流群:708072830】;

💞鉴于个人经验有限,所有观点及技术研点,如有异议,请直接回复参与讨论(请勿发表攻击言论,谢谢);

💕版权声明:原创不易,转载请附上原文出处链接和本文声明,版权所有,盗版必究!!!谢谢。