【go】剑指offer:用26个英文字母组合表示列数

本文介绍了一个从26进制的英文字母序列转换为10进制列号的问题,通过分析和举例解释了转换逻辑,并提供了两种不同的代码实现方式,包括优化后的O(1)空间复杂度解决方案。

不忘初心,砥砺前行 

作者 | 陌无崖

转载请联系授权 

题目要求

  

在EXCEL中常常用英文字母表示列,如A为1,B为2.....Z为26,依次进行一个循环,AA为27,AB为28,按照这样的规律,要求输入一个字符串求出为第几列。

题目分析

  

这道题很容易得出是一道进制转换的问题,即26进制转换成10进制,因此我们只需要知道不同进制转换成10进制的计算规律即可。

举例"ABCD"

10进制(D)*26^0+10进制(C)*26^1+...

还不理解,可以假设ABCD为数组data,反转为DCBA,i为下标则:

D*26^i+C*26^(++i).....

代码思路

  

1、首先我们需要将A~Z和1~26进行绑定

2、遍历我们的字符串,倒叙进行求和


代码如下:

func init() {
  data = make(map[rune]int, 26)
  for i := 'A'; i <= 'Z'; i++ {
    data[i] = int(i) - 64
  }
}
func TwentysixToTen(str string) int {
  if len(str) <= 0 {
    return 0
  }
  sum := 0
  for i, _ := range str {
    j := len(str) - 1 - i
    m := Calaute(i)
    sum += (data[rune(str[j])] * m)
  }
  return sum
}


// 计算26的几次
func Calaute(n int) int {
  sum := 1
  for i := 0; i < n; i++ {
    sum *= 26
  }
  return sum
}

在上面的代码中我们由于使用了map,导致了我们的空间复杂度为O(n),那么如何将空间复杂度降低到O(1)呢?我们可以巧妙的利用字符和数字的转换如下代码

// 第二种解法降低空间复杂度O(1)
func TwentysixToTen_two(str string) int {
  sum := 0
  for i := len(str) - 1; i >= 0; i-- {
    // 确定了每一个字符所对应的整数
    p := int(str[i])
    if (p-64) > 26 || (p-64) < 1 {
      return 0
    }
    m := Calaute(len(str) - 1 - i)
    sum += (p - 64) * m
  }
  return sum
}

马上期末考试了,最近一直忙着复习专业课,组成原理啥的,整理笔记没有太多时间了,因此挑出来的是觉得比较好的,其它的代码没有整理成笔记,都在github仓库,想去看的可以点击阅读原文。

查看完整源码可以点击阅读原文进入github仓库,如果喜欢,感谢你为我点一个星星^_^


END

今日推荐阅读

RabbitMQ系列笔记广播模式和路由模式 
RabbitMQ系列笔记入门篇

RabbitMQ系列笔记work模式

RabbitMQ系列笔记work模式

protoc语法详解及结合grpc定义服务

Golang中Model的使用

基于Nginx和Consul构建高可用及自动发现的Docker服务架构

▼关注我,一起成长

    主要分享 学习心得、笔记、随笔▼

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值