第八题
这道题目说的是将字符串转换成整数,按照题目描述可以分成如下几步:如果字符串最开始有空格则将空格去掉;读取最开始字符,如果是负号则最后的结果输出为负数,如果是正号则最后结果输出为正,如果在最开始字符处没有读取到任何符号则默认最后结果为正;读取数字时前序如果有多个零则从第一个不是零的数字开始直到字符串结束或遇到不为数字的字符。因此就可以想见在代码中需要一个变量用来指示符号,需要一个变量用来指示字符串中的下标,最后需要检查所得数字是否超过32为整数范围。代码如下:
class Solution:
def myAtoi(self, s: str) -> int:
# 定义 32 位整数的范围
INT_MIN, INT_MAX = -2**31, 2**31 - 1
# 去掉字符串前后的空格
s = s.strip()
if not s:
return 0
# 检查符号
sign = 1
index = 0
if s[0] == '-':
sign = -1
index += 1
elif s[0] == '+':
index += 1
# 转换数字
result = 0
while index < len(s) and s[index].isdigit():
digit = int(s[index])
# 检查是否会溢出
if result > (INT_MAX - digit) // 10:
return INT_MAX if sign == 1 else INT_MIN
result = result * 10 + digit
index += 1
return result * sign
在写的过程中也复习了一下关于字符串的操作:
string.strip([chars])
#chars(可选):要移除的字符集合,如果不指定的话,默认移除空格和换行符
#返回值:返回移除两端指定字符后的新字符串
string.isdigit()
#判断字符串是否只包含数字字符
#返回值:若只包含数字字符(0-9)则返回True,否则返回False
第九题
题目描述的是输出回文数,也就是说如果这个数字从前向后和从后往前都是同样的数,因此首先想到的最简便的方法就是将这个数转换成字符串之后,判断其正序和倒序是否相等。也就是这样:
class Solution:
def isPalindrome(self, x: int) -> bool:
# 负数一定不是回文数
if x < 0:
return False
# 将整数转换为字符串,判断正序和倒序是否相等
return str(x) == str(x)[::-1]
最先的判断是源于负数一定不是回文数因为有负号的存在,如果一个数以零结尾也一定不是回文数(不包括零本身),但是在采用转换为字符串时不需要对这一条件进行检测,因为正序和倒序字符串检测时暗含了对这一条件的检测。同样也可以采用数学的方法对回文数进行检测,将数字逐位进行提取,判断反转后的数字是否与原数字相等,反转的数字只需要反转一半,对于数字长度为奇数的,中间数字可以通过除法去掉,再与反转的数字进行比对,数字长度为偶数时直接将反转一半的数字进行比对即可。
def isPalindrome(self, x: int) -> bool:
# 负数和以 0 结尾的数(但不包括 0 本身)一定不是回文数
if x < 0 or (x % 10 == 0 and x != 0):
return False
reversed_half = 0
while x > reversed_half:
# 取出最后一位数字并将其加入反转后的数字
reversed_half = reversed_half * 10 + x % 10
# 去掉最后一位数字
x //= 10
# 如果数字长度是奇数,中间的数字可以忽略(通过 reversed_half // 10)
return x == reversed_half or x == reversed_half // 10
&spm=1001.2101.3001.5002&articleId=147934192&d=1&t=3&u=aaa91b46f908478284a3d829eddc04cc)
2万+

被折叠的 条评论
为什么被折叠?



