实用算法题:excel表列序号与十进制数字的互相转化算法讲解!

您所在的位置:网站首页 用字母ab表示 实用算法题:excel表列序号与十进制数字的互相转化算法讲解!

实用算法题:excel表列序号与十进制数字的互相转化算法讲解!

2023-09-04 19:43| 来源: 网络整理| 查看: 265

日常生活中excel的使用大家都不陌生,可能几列的表格我们还能脑海中参照A-Z来区分对应的数字应该是几。但有的表格列过多,或者鼠标一甩到了很后面的位置,好几个字母拼起来,一时间很难反映过来对应的数字是多少列。所以今天力扣这两道算法题,就帮我们解决了这个问题。当然近半年的这两题的出题公司有:

微软 6次Shopee 3次苹果 2次高盛 2次

额,居然没有国内大厂?是要把excel换成WPS,才更贴切国内考点吗?哈哈.... 下来,让我们逐个题目分析下解题方法吧!

171.Excel表列序号

https://leetcode-cn.com/problems/excel-sheet-column-number/solution/171excelbiao-lie-xu-hao-xiang-xi-jie-xi-4bygt/

难度:简单

题目

给定一个Excel表格中的列名称,返回其相应的列序号。 例如,

A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ... 示例 示例 1: 输入: "A" 输出: 1 示例 2: 输入: "AB" 输出: 28 示例 3: 输入: "ZY" 输出: 701 分析

关于excel列表序号,先来看这道简单的开胃菜题目,之后还有逆向的对比题目:

168.Excel表列名称

由于excel列表是A-Z的26位数字, 当数字为27时就变成了AA,那么很明确是26进制。 将这道题转化为26进制转10进制的思路后,就很简单了。由于columnTitle是字符串类型, 我们就举个关于十进制字符串求总和的例子,来套用这道题。

如何将'123'转化为十进制数?大佬们要说了int(123),如果是要说这种解题思路, 那来来来键盘给你,你来写(这里举例子10进制只是为了方便大家理解)。

首先我们需要定义初始num = 0然后for循环每一个字符串现将上一次计算的num * 进制数(这里为10),然后在加上当前的数字重复3动作最终求总和后返回结果即可。

有了上面的思路,那这道题照搬模板打套路就好了。这里唯一要注意的一点是,excel中 A-Z代表1--26,是没有0的,所以当我们获取到每一位的字符串时通过ord('string') - ord('A') + 1的公式获取结果,当然为了运行加速, 简便的方式就是 ord('A') - 1 = 65 - 1 = 64,改写为 ord('string') - 64。 算法本身就是扣细节的事情,能省则省。来看看解题:

解题 class Solution: def titleToNumber(self, columnTitle): ret = 0 for i in columnTitle: ret = ret * 26 + ord(i) - 64 return ret

有了这道题的基础,再来看下面这道逆向转换的题目,就更简单了。

168.Excel表列名称

https://leetcode-cn.com/problems/excel-sheet-column-title/solution/168excelbiao-lie-ming-cheng-excelbiao-mi-sv3v/

难度:简单

题目

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

提示:

1 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" 分析

在看这道题之前,建议大家先去阅读下它的逆向题目,看过之后更便于理解这道题。

171.Excel表列序号

如果excel的设计A-Z代表0-25,那么就没什么难度了,可是偏偏代表的是1-26,没有零什么事儿! 首先要明确27的excel列表名称是AA,就很明确的告诉大家这是一道10进制转26进制的题目。 唯一绕的就是,我们如何让每一位都从0开始呢?其实想想很简单,每一位的时候, 我们先将当前值减去1,再做计算不就好了嘛! 这里用到python的divmod方法,简便求出结果:商,余数 = divmod(被除数,除数) 至于65,则是由于chr(65) = "A",既然已经知就没必要每次再转换了...

解题 class Solution: def convertToTitle(self, columnNumber: int) -> str: ret = '' while columnNumber: columnNumber -= 1 columnNumber, num = divmod(columnNumber, 26) ret = chr(65 + num) + ret return ret

欢迎关注我的公众号: 清风Python,带你每日学习Python算法刷题的同时,了解更多python小知识。

我的个人博客:https://qingfengpython.cn

力扣解题合集:https://github.com/BreezePython/AlgorithmMarkdown



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3