当前位置: 首页 > news >正文

生成 Excel 表列名称

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.tdef 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_stringend
end

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


http://www.lryc.cn/news/464491.html

相关文章:

  • 基于yolov10的烟雾明火检测森林火灾系统python源码+pytorch模型+评估指标曲线+精美GUI界面+数据集
  • UltraISO(软碟通)制作U盘制作Ubuntu20.04启动盘
  • 【EtherCAT实践篇一】TwinCAT 3安装、使用
  • 4、CSS3笔记
  • Docker无法拉取镜像解决办法
  • Ubuntu 20.04安装Qt 5.15(最新,超详细)
  • 桂林旅游一点通:SpringBoot平台应用
  • 【WPF】04 Http消息处理类
  • 如何精准设置线程数,提升系统性能的秘密武器!
  • 正则表达式:从入门到精通
  • CRMEB标准版Mysql修改sql_mode
  • linux驱动访问的地址为虚拟地址
  • 基于SpringBoot+Vue+uniapp微信小程序的社区门诊管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
  • 使用WPF写一个简单的开关控件
  • FPGA采集adc,IP核用法,AD驱动(上半部分)
  • MongoDB 如何做mapreduce
  • Vue是一套构建用户界面的渐进式框架,常用于构建单页面应用
  • c++ 桶排序(看这一篇就够了)
  • 格点拉格朗日插值与PME算法
  • 【LVGL快速入门(二)】LVGL开源框架入门教程之框架使用(UI界面设计)
  • jmeter中用csv data set config做参数化2
  • 背包问题整理
  • 基于Matlab车牌识别课程设计报告
  • SSM框架实战小项目:打造高效用户管理系统 day3
  • 一款现代化、可定制的跨平台文件浏览器,高颜值高效率的的管理神器!(附私活源码)
  • 【C】二分查找与函数1
  • 光纤光学的基本方程
  • 题解:CF584D Dima and Lisa
  • 【OD】【E卷】【真题】【100分】内存资源分配(PythonJavaJavaScriptC++C)
  • Linux基础项目开发day05:量产工具——页面系统