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

[Go版]算法通关村第十二关青铜——不简单的字符串转换问题

目录

  • 题目:转换成小写字母
    • 思路分析:大写字母ASCII码 + 32 = 小写字母ASCII码
    • Go代码
    • Go代码-优化: 大写字母ASCII码 | 32 = 小写字母ASCII码
  • 题目:字符串转换整数(atoi)
    • 思路分析:去除首部空格 + 明确正负 + 读取数字 + 判断越界
    • Go代码

题目:转换成小写字母

题目链接:LeetCode-709. 转换成小写字母
在这里插入图片描述

思路分析:大写字母ASCII码 + 32 = 小写字母ASCII码

  • 大写字母 A - Z 的 ASCII 码范围为 [65,90]
  • 小写字母 a - z 的 ASCII 码范围为 [97,122]
    所以,只要字符的ASCII码再[65,90]的范围内,将它增加32即可得到对应的小写字母。

Go代码

func toLowerCase(s string) string {ret := make([]rune, len(s))for i, v := range s {if v >= 'A' && v <= 'Z' {ret[i] = v + 32} else {ret[i] = v}}return string(ret)
}

Go代码-优化: 大写字母ASCII码 | 32 = 小写字母ASCII码

[65,90]对应的二进制表示为[ (01000001)2,(01011010)2 ]
32对应的二进制表示为 (00100000)2
对于[ (01000001)2,(01011010)2 ] 内的所有数,表示32的那个二进制位都是0,所以可以对其ASCII码与32做按位或运算,替代与32的加法运算

上面使用了[]rune切片来存储新的字符,这里我们换种写法,使用strings.Builder来构建字符串

func toLowerCase(s string) string {str := &strings.Builder{}str.Grow(len(s))for _, v := range s {if v >= 65 && v <= 90 {str.WriteRune(v | 32)} else {str.WriteRune(v)}}return str.String()
}

题目:字符串转换整数(atoi)

题目链接:LeetCode-8. 字符串转换整数 (atoi)
在这里插入图片描述

思路分析:去除首部空格 + 明确正负 + 读取数字 + 判断越界

  1. 去除首部空格:== ’ ’ 就跳过
  2. 明确正负:默认为1,如果第一个有效字符== ‘-’ 就是-1
  3. 读取数字:
    • 字符 0-9 的 ASCII 码范围为 [48,57],所以通过字符的 ASCII 码值减去 48 可获得相应的数字
    • 值的拼装为 res = res * 10 + v * sign
  4. 判断越界:
    • 超过最大值:res > (math.MaxInt32-v) / 10
    • 小于最小值:res < (math.MinInt32+v) /10

Go代码

func myAtoi(s string) int {ret := 0i := 0length := len(s)sign := 1// 去除首部空格for _, v := range s {if v == ' ' {i++} else {break}}// 获得+-if i < length && (s[i] == '+' || s[i] == '-') {sign = getSign(s[i])i++}// 读取数字for i<length {if s[i] >= '0' && s[i] <= '9' {v := getIntByChar(s[i])// 判断越界问题if MoreThanMax(ret, v) || LittleThanMin(ret, v) {if sign == 1 {return math.MaxInt32}return math.MinInt32}ret = ret*10 + sign*vi++} else {return ret}}return ret
}
func getSign(str byte) int {if str == '-' {return -1}return 1
}
func getIntByChar(ch byte) int {return int(ch-'0')
}
func MoreThanMax(ret, v int) bool {if ret > (math.MaxInt32-v)/10 {return true}return false
}
func LittleThanMin(ret, v int) bool {if ret < (math.MinInt32+v)/10 {return true}return false
}
http://www.lryc.cn/news/127292.html

相关文章:

  • 十种排序算法(附动图)
  • 【校招VIP】测试类型之兼容性测试分析
  • STM32--TIM定时器(1)
  • Android取证——基础知识
  • 【学习心得】安装cuda/cudann和pytorch
  • 中电金信通过KCSP认证 云原生能力获权威认可
  • 【Spring】Bean的实例化
  • 2023牛客暑期多校训练营8-C Clamped Sequence II
  • 【GitLab私有仓库】如何在Linux上用Gitlab搭建自己的私有库并配置cpolar内网穿透?
  • 企业计算机服务器遭到了locked勒索病毒攻击如何解决,勒索病毒解密
  • Redis哨兵模式搭建
  • 大语言模型控制生成的过程Trick:自定义LogitsProcessor实践
  • Docker容器:docker的资源控制及docker数据管理
  • 从零开始打造家装预约咨询小程序
  • es线上处理命令记录
  • mysql 在nodejs中的简单使用(增删改查)
  • 1.MySQL数据库的基本操作
  • Zabbix-6.4.4 邮箱告警SMS告警配置
  • 网络安全 Day30-运维安全项目-容器架构上
  • 深入理解设计模式-创建型之单例模式
  • Vue中路由缓存问题及解决方法
  • Linux与bash(基础内容一)
  • NVIDIA Omniverse与GPT-4结合生成3D内容
  • Windows Server --- RDP远程桌面服务器激活和RD授权
  • 关于游戏盾
  • 回归预测 | MATLAB实现基于SSA-KELM-Adaboost麻雀算法优化核极限学习机结合AdaBoost多输入单输出回归预测
  • 《cpolar内网穿透》外网SSH远程连接linux(CentOS)服务器
  • IDEA启动报错【java.sql.SQLSyntaxErrorException: ORA-00904: “P“.“PRJ_NO“: 标识符无效】
  • Nginx详解
  • 摸清一下mysql授权语句的实际执行关系