题007
题意
给定一个32位的有符号整数,将这个整数所有位上的数字进行反转
提示
-2^31 <= x <= 2^31 - 1
解题思路
本题思路比较简单:
- 将数字转化为字符串
- 判断第一位是否为负号:
- 正数:整个字符串翻转
- 负数:第二位开始进行翻转
- 翻转后加上符号,用int转换类型后输出
- 输出时需要考虑32位这个限定条件,即大于-2147483648,小于2147483647
代码
def reverse(self,x: int)->int:
m=str(x)
res=0
if m[0]=='-':#若为负数
res=int('-'+m[1:][::-1])
else:
res=int(m[::-1])
return res if -2147483648<res<2147483647 else 0
题008
题意
将一个字符串转化为整数
- 字符串前面的空格需要丢弃
-若第一个非空字符是数字,从它开始取尽可能多的连续数字字符,组成一个整数 - 若第一个非空字符为正负号,从它开始操作同上,组成一个有符号整数
- 有效的整数字符以外的字符可以被忽略
- 若字符串为空,或者第一个字符不满足上述要求,则返回0
注意
- 数值范围限定在
-2^31 <= x <= 2^31 - 1
,若超出这个范围,就输出边缘值
eg
输入: “42”
输出: 42
输入: " -42"
输出: -42
输入: “4193 with words”
输出: 4193
输入: “words and 987”
输出: 0
输入: “-91283472332”
输出: -2147483648
解题思路
法一
根据优秀题解,学习正则表示式的使用方法:
^:匹配字符串开头
[\+\-]:表示一个+字符 或者 -字符
?:表示前面的一个字符可有可无(此处指+-符号)
\d:一个数字
+:前面一个字符的一个或多个(此处指一个或多个数字)
\D:一个非数字字符
*:前面一个字符的0个或多个
整体的正则表示式为:^[\+\-]?\d+
拆开讲解:
[+-]? 可能有正负符号
\d+ 一个或多个数字
**一行代码 **
# lstrip() 方法用于截掉字符串左边的空格或指定字符
return max(min(int(*re.findall('^[\+\-]?\d+', s.lstrip())), 2**31-1), -2**31)
逐行写
def myAtoi(self,s:str)->int:
str=s.lstrip()
num_re=re.compile(r'^[\+\-]?\d+') #设置正则的规则
num=num_re.findall(str) #进行匹配
num=int(*num) #转换为整数
return max(min(num, 2**31-1),-2**31)
法二
最简单的解法,建立一个字典,将字符对应到数字,然后依次匹配,计算答案。
def myAtoi(self,s:str)->int:
d={
'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}
s=s.lstrip()#去除空格
flag=1
res=0
if len(s)<1:
return 0
#判断最前面是否为正负号,如有符号,去除第一位
if s[0]=='-':
flag=-1
s=s[1:]
elif s[0]=='+':
s=s[1:]
i=0
while i <len(s) and s[i] in d:
res=res*10+d[s[i]]
i+=1
res*=flag
return max(min(res,2**31-1),-2**31)
题009
题意
判断一个整数是否为回文数
解题思路
- 若转化为字符串
def isPalindrome(self, x: int) -> bool:
t=str(x)
return t==t[::-1]
- 不转化为字符串
将该数不断除以10,从而产生一个反转的int整数,达到不转化为字符串的要求。
def isPalindrome(self, x: int) -> bool:
y=abs(x)
res=0
while y>0:
res=res*10+y%10
y//=10
return res==x