生成 Excel 表列名称

news2024/10/17 16:08:38

Excel 大家都用过,它的列名是用字母编号的,A 表示第一列,B 表示第二列,AA 表示第27列,AB 表示第28列等等。

现给定一个数字,如何得到列名称呢。比如输入28,输出 AB。

一开始以为就是一个简单的26进制转换,到底还是大意了,这里的每一位都是没有0的,而且能取到进制的最大值。正常26进制每一位都是0到25,但是这里却是1到26。

算法原理还是不停的取模和取余来得到每一位的值。只不过和正常的 n 进制转换不同,我们不能直接用 n 去取模和取余,而是应该用 n-1。

还是按26进制计算,假设要表示的数为 num,余数为 r,则:
n u m = n × 26 + r num = n \times 26+r num=n×26+r
其中 r r r 的范围是0到25,假设 R R R 的范围是1到26,我们将 r r r 线性映射到 R R R,并将 r r r 替换成 R R R,于是:
n × 26 + R = n u m + 1 n \times 26+R=num+1 n×26+R=num+1
我们会发现在将 r r r 替换成 R R R 的过程中, n u m num num 实际上每次都多加了1,所以在计算每一位的值时要将它减出来。

另外我们可以想一下,在取余的过程中,有两种情况:
n u m = n × 26 + r n u m = n × 26 \begin{align} num & = n \times 26 + r \\ num & = n \times 26 \end{align} numnum=n×26+r=n×26
第一种情况其实可以正常计算,第二中情况不行,因为不会出现0,所以我们需要改写一下:
n u m = ( n − 1 ) × 26 + 26 num=(n-1)\times 26 + 26 num=(n1)×26+26
但是正常取余运算算不出这个余数,怎么办呢,给 n u m num num 减去1就可以了:
n u m − 1 = ( n − 1 ) × 26 + 25 num-1=(n-1)\times 26 + 25 num1=(n1)×26+25
对于其他情况也一样,于是就统一变成了:
n u m − 1 = n × 26 + ( r − 1 ) num-1=n \times 26 + (r-1) num1=n×26+(r1)
至于多减的1,会自动补回来。

defmodule Solution do
  @spec convert_to_title(column_number :: integer) :: String.t
  def convert_to_title(column_number) do
    {column_number, 26}
    |> Stream.unfold(fn
            {0, _} -> nil
            {n, m} -> {rem(n - 1, m) + ?A, {div(n - 1, m), m}}  
        end)
    |> Enum.reverse
    |> List.to_string
  end
end

在 Elixir 中,我们可以通过 Stream.unfold 来构造每一位的值,连递归都不用写了,可以说是十分优雅了。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2217172.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ 算法学习——1.9 Kruskal算法

Kruskal算法是一种用于解决最小生成树(Minimum Spanning Tree)问题的贪婪算法。 Kruskal算法步骤: 初始化:将图中的所有边按照权值从小到大进行排序。 创建并查集:为每个顶点创建一个集合,用于判断两个顶…

中国灌溉农田空间分布

针对全国灌溉农田空间分布数据缺失的现状,融合MODIS植被指数和统计数据生成MIrAD-GI临时灌溉数据集,再利用约束统计和协同绘图方法将其与中国区域现有灌溉数据进行集成、整合,生成了2000-2019年中国逐年灌溉农田分布数据集(500米空…

5、JavaScript(四)

25.ajax : 前端向后端异步的取数据而无需刷新页面的技术 1 公司中的整体工作流程 1、项目开发的流程 每个职位该做的工作: 产品经理:提需求的 与客户沟通 画出原型图给程序员使用 UI设计师:美化 替换UI框架:antd element-ui e…

python将照片集导出成视频

shigen坚持更新文章的博客写手,记录成长,分享认知,留住感动。个人IP:shigen 背景 一个安静的下午,看着电脑里乱七八糟的照片,有大有小,宽高不一,突然想找个方式把他们统一起来&…

SketchUp Pro 2024 for Mac 3D建模 草图设计大师软件安装【保姆级教程,简单小白轻松上手】

Mac分享吧 文章目录 SketchUp Pro 3D建模 草图设计大师软件 安装完成,软件打开效果一、Mac中安装SketchUp Pro 3D建模 草图设计大师软件——v241️⃣:下载软件2️⃣:安装软件,将安装包从左侧拖入右侧文件夹中3️⃣:应…

【数据结构】7道经典链表面试题

目录 1.返回倒数第K个节点【链接】 代码实现 2.链表的回文结构【链接】 代码实现 3.相交链表【链接】 代码实现 4.判断链表中是否有环【链接】 代码实现 常见问题解析 5.寻找环的入口点【链接】 代码实现1 代码实现2 6.随机链表的复制【链接】 代码实现 7.顺序…

DS堆的特性和实现(9)

文章目录 前言一、堆的概念和结构二、堆的调整算法向下调整算法向上调整算法两种算法建堆的时间复杂度 三、堆的实现结构体定义初始化和销毁堆的插入堆的删除挪移数据覆盖删除首尾交换再删除 获取堆顶元素获取有效数据个数判断是否为空 总结 前言 继续,本篇较难   …

我的创作纪念日-365天的感悟

时光荏苒,岁月如梭。转眼间,自己在CSDN注册已经整整15个年头了。回想起当初,还是个满怀憧憬、对未来充满无限好奇的学生哥。如今,虽然身份和角色发生了诸多变化,但CSDN始终陪伴着我,见证了我的成长与蜕变。…

JavaWeb环境下的Spring Boot在线考试系统开发

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理基于JavaWeb技术的在线考试系统设计与实现…

深入探讨C++多线程性能优化

深入探讨C多线程性能优化 在现代软件开发中,多线程编程已成为提升应用程序性能和响应速度的关键技术之一。尤其在C领域,多线程编程不仅能充分利用多核处理器的优势,还能显著提高计算密集型任务的效率。然而,多线程编程也带来了诸…

OpenAI的新功能Canvas,效果还不错

时隔两年,ChatGPT终迎来界面全新升级! 这一次,OpenAI官宣推出类似 Anthropic 的 Artifacts 的界面交互功能 canvas,并称这是一种使用 ChatGPT 写作和编程的新方式。不论是写作,还是编码,都可以开启全新的交…

什么!我上传的文件不见了?

什么!我上传的文件不见了? 前言: 最近在实现一个文件上传功能时使用了异步处理,但是在异步处理文件时,却提示NoSuchFileException错误。简化代码如下: PostMapping("/upload")void testFileUpload(Reques…

Flume抽取数据(包含自定义拦截器和时间戳拦截器)

flume参考网址:Flume 1.9用户手册中文版 — 可能是目前翻译最完整的版本了https://flume.liyifeng.org/?flagfromDoc#要求: 使用Flume将日志抽取到hdfs上:通过java代码编写一个拦截器,将日志中不是json数据的数据过滤掉&#xf…

学习文档10/16

MySQL 字符集: MySQL 支持很多种字符集的方式,比如 GB2312、GBK、BIG5、多种 Unicode 字符集(UTF-8 编码、UTF-16 编码、UCS-2 编码、UTF-32 编码等等)。 查看支持的字符集 你可以通过 SHOW CHARSET 命令来查看,支持…

一次性理清Environment体系

在Spring中,我们可以通过配置文件等方式去进行一些属性值的配置,比如通过Value注解去获取到对应的属性值,又或者说是想在程序运行时获取系统环境变量,类似的这些操作其实都是去获取一些配置数据,所以在Spring中对这些数…

C++ | Leetcode C++题解之第486题预测赢家

题目&#xff1a; 题解&#xff1a; class Solution { public:bool PredictTheWinner(vector<int>& nums) {int length nums.size();auto dp vector<int>(length);for (int i 0; i < length; i) {dp[i] nums[i];}for (int i length - 2; i > 0; i-…

基于SpringBoot+Vue+uniapp的在线招聘平台的详细设计和实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

喜报丨财富通科技荣获ISO9001、ISO27001及ISO20000三项国际认证

近日&#xff0c;财富通科技成功通过ISO9001、ISO27001及ISO20000三项国际标准认证。这标志着公司在质量管理体系、信息安全管理体系以及信息技术服务管理体系建设方面达到了国际认可的标准。 ISO9001认证表明财富通科技在软件开发、技术服务和项目管理等方面建立了一套完善的…

带你学习如何编写一篇API详设文档以及给新人提点建议

文章目录 前言先认清一个问题详设文档如何写先看文档脉络详设文档分析需求背景方案概述API定义安全设计性能设计缓存与数据库 总结 前言 这篇文章带读者了解软件开发项目中一个需求的开发详设文档主要包括哪些内容&#xff0c;其中重点会给读者分析API设计的规范&#xff0c;相…

推荐算法的学习

文章目录 前言1、模型1.1 从本领域模型的发展历史中学习1.1.1 在历史中总结发展规律和趋势1.1.2 发现模型之间的共性&#xff0c;方便记忆 1.2 从其他领域的发展中学习1.2.1 注意力机制1.2.2 残差网络 1.3 实践该怎么办&#xff1f; 2、 特征2.1 数据源的选择与建立2.2 特征构造…