专栏首页陌无崖知识分享【go】剑指offer:用26个英文字母组合表示列数

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

作者 | 陌无崖

转载请联系授权

题目要求

在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仓库,想去看的可以点击阅读原文。

本文分享自微信公众号 - golang技术杂文(gh_ebbdb61f463e),作者:无崖子天下无敌

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 剑指 Offer(C++版本)系列:剑指 Offer 12 矩阵中的路径

    同步GitHub在此 ? https://github.com/TeFuirnever/GXL-Skill-Tree

    我是管小亮
  • 校招面试手撕算法汇总

    所有题目都是从面经中提取而来,持续更新。 本人也是菜鸟一枚,帖子也会相应的发布自己对于题目的解法和看法,但是可能想得不够,也希望大家能够一起讨论,一起进步。 1...

    牛客网
  • 【leetcode】有效的字母异位

    给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词。

    ConardLi
  • 剑指Offer系列刷题笔记汇总

    版权声明:本文为博主原创文章,未经博主允许不得转载。个人网站:http://cuijiahua.com。 ...

    Jack_Cui
  • 48个Shell脚本小技巧(二)

    23. 产生一个随机数 代码如下: echo $RANDOM 24. 按照模式split 文件 代码如下: csplit server.log ...

    吴柯
  • 剑指 Offer(C++版本)系列:剑指 Offer 11 旋转数组的最小数字

    同步GitHub在此 ? https://github.com/TeFuirnever/GXL-Skill-Tree

    我是管小亮
  • Day68:剑指Offer总结

      本人花了两个月时间刷完了牛客网带上的剑指Offer,一共67题。本人是从4月21日开始刷题,每天一题,截止到7月6日已经全部刷完。这67题均是考察的数据结构...

    一计之长
  • 牛客网剑指offer java 全部题解

    https://mp.weixin.qq.com/s?__biz=MzI5MzYzMDAwNw==&mid=2247485570&idx=2&sn=bcde8b...

    乔戈里
  • 翻转单词顺序

    输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串 "I am a student. ",则...

    用户4456933
  • 剑指 Offer(C++版本)系列:剑指 Offer 13 机器人的运动范围

    同步GitHub在此 ? https://github.com/TeFuirnever/GXL-Skill-Tree

    我是管小亮
  • 剑指 Offer(C++版本)系列:剑指 Offer 10- II 青蛙跳台阶问题

    同步GitHub在此 ? https://github.com/TeFuirnever/GXL-Skill-Tree

    我是管小亮
  • 剑指 Offer(C++版本)系列:剑指 Offer 10- I 斐波那契数列

    同步GitHub在此 ? https://github.com/TeFuirnever/GXL-Skill-Tree

    我是管小亮
  • 剑指 Offer(C++版本)系列:剑指 Offer 09 用两个栈实现队列

    同步GitHub在此 ? https://github.com/TeFuirnever/GXL-Skill-Tree

    我是管小亮
  • 剑指 Offer(C++版本)系列:剑指 Offer 06 从尾到头打印链表

    同步GitHub在此 ? https://github.com/TeFuirnever/GXL-Skill-Tree

    我是管小亮
  • 刷题两个月,从入门到字节跳动offer,这是我的模板 | GitHub 1.2k星

    按照他的经历来说,四月份找工作开始,从0开始刷LeetCode,现在已经是字节跳动的员工了。

    五分钟学算法
  • 干了三年的程序员花了一年时间才拿下头条offer,原因竟然是这个!

    1.老板张一鸣跟我是福建老乡,龙岩市在我朋友说来就是山沟沟,能走出美团王兴和头条张一鸣让我卯足了去龙岩吃特产老鼠干的欲望。

    Java程序猿
  • 14种模式搞定面试算法编程题(PART I)

    面试锦囊系列一直有收到大家的反馈,包括后台内推成功的消息、朋友的同事从创业小公司成功跳到huawei等等,非常高兴小破号的这些整理分享能够真正地帮助到大家

    NewBeeNLP
  • 快速拿下面试算法

    在面试前一周,我刷了很多道算法,分类刷,有些是做过的,因为我是面试C++相关岗位,除了leetcode与剑指offer相关的算法,还需要手撕一些智能指针呀,单例...

    公众号guangcity
  • 剑指offer(25-30)题解

    萌萌哒的瓤瓤

扫码关注云+社区

领取腾讯云代金券