字符串
存放数字、字母、特殊字符
字母有可以大写和小写
常见题目类型转换,几种类型之间的相互转换
转换过程中需要处理的几种特殊情况
转之前先判断当前元素能不能转
如果字符串转数字,要考虑当前元素是不是数字,转完之后会不会溢出
转换成小写字母
LeetCode 709. 转换成小写字母
https://leetcode.cn/problems/to-lower-case/
思路分析
每个字母都有对应的ASCII码,根据ASCII码表对字符串进行操作
常见ASCII码表
a-z 97-122
A-Z 65-90
0-9 48-57
先遍历整个字符串,然后对每一位字符进行判断,如果str[i]的值在A-之间,需要在原来的基础上加上32进行小写转换
代码实现
python内置方法ord() 与 chr()
ord() 返回字符对应的ASCII码
chr() 返回ASCII码对应的字符
class Solution:
def toLowerCase(self, s: str) -> str:
chars = list(s)
for i in range(len(chars)):
if "A" <= chars[i] <= "Z":
chars[i] = chr(32 + ord(chars[i]))
return "".join(chars)
字符串转换整数(atoi)
涉及到数字溢出的处理
LeetCode8. 字符串转换整数 (atoi)
https://leetcode.cn/problems/string-to-integer-atoi/
思路分析
函数 myAtoi(string s) 的算法如下:
- 读入字符串并丢弃无用的前导空格
- 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
- 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
- 将前面步骤读入的这些数字转换为整数(即,“123” -> 123, “0032” -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
- 如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
- 返回整数作为最终结果。
罗列几个要点
- 去掉前导空格
- 判断第一个字符为+和-的情况,设计变量sign,初始化为1,遇到-,sign修正为-1
- 判断是否为数字,使用ASCII码数值进行判断,‘0’<=char<=‘9’,如果0在最前面,需要去除
- 遇到第一个不是数字的字符的情况下,转换停止,退出循环
- 转换以后数字超过 int 类型范围,需要截取。
不能将结果res变量设计为long类型
注意:由于输入的字符串转换以后也有可能超过long类型,因此需要在循环内部就判断是否越界,只要越界就退出循环,这样也可以减少不必要的计算 - 涉及数组下标访问,全程需要考虑数组下标是否越界情况
特别注意:
- 由于题目中说 环境只能保存32位整数,因此这里在每一轮循环之前先要检查,具体细节详见编码
- Java、Python和C++字符串的设计都是不可变的,即使用trim()会产生新的变量,因此我们尽量不使用库函数,使用一个变量index去做遍历,这样遍历完成以后就得到转换以后的数值
代码实现
python语法
求幂x的y次方 x**y
去除两端空格 str.strip()
判断是否是数组 isdigit()
class Solution:
def myAtoi(self, s: str) -> int:
# 去除字符串两端空格
s = s.strip()
# 判断字符串是否为空
if not s:
return 0
# 检查第一个字符
if s[0] == '-':
sign = -1
s = s[1:]
elif s[0] == '+':
sign = 1
s = s[1:]
elif '0' <= s[0] <= '9':
sign = 1
else:
return 0
# 将连续的数字字符转换为整数
num = 0
for i in s:
if i.isdigit():
num = num * 10 + int(i)
else:
break
# 处理正负号和溢出的情况
num = sign * min(num, 2 ** 31 - 1)
return num