字符串转换整数

LeetCode刷题笔记

字符串转换整数

题目链接: https://leetcode-cn.com/problems/string-to-integer-atoi/


​ 请你来实现一个 atoi 函数,使其能将字符串转换成整数。

​ 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。

​ 当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。

​ 该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。

​ 注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。

​ 在任何情况下,若函数不能进行有效的转换时,请返回 0。

​ 说明:

​ 假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。

示例 1:

输入: “42”
输出: 42

示例 2:

输入: “ -42”
输出: -42
解释: 第一个非空白字符为 ‘-‘, 它是一个负号。
我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。

示例 3:

输入: “4193 with words”
输出: 4193
解释: 转换截止于数字 ‘3’ ,因为它的下一个字符不为数字。

示例 4:

输入: “words and 987”
输出: 0
解释: 第一个非空字符是 ‘w’, 但它不是数字或正、负号。
因此无法执行有效的转换。

示例 5:

输入: “-91283472332”
输出: -2147483648
解释: 数字 “-91283472332” 超过 32 位有符号整数范围。
因此返回 INT_MIN (−231) 。


大佬代码

1
2
3
class Solution:
def myAtoi(self, str: str) -> int:
return max(min(int(*re.findall('^[\+\-]?\d+', str.lstrip())), 2**31 - 1), -2**31)
提交结果 执行用时 内存消耗 语言
通过 40 ms 13 MB Python3

果然N个ifelse不敌一个正则,解析一下大佬的意思

把去过左面空格的字符串传入正则,正则匹配+或-开头并且后面为数字的字符串,把字符串转换为整数,与两个边界比较。


执行速度最快的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Solution:
def myAtoi(self, str: str) -> int:
str = str.lstrip()
count =''
if str == '':
return 0
if str[0]=='+' or str[0]=='-':
count+=str[0]
for i in str[1:]:
if '0'<=i<='9':
count+=i
else:
break
elif '0'<=str[0]<='9':
for i in str:
if '0'<=i<='9':
count+=i
else:
break
else:
return 0
if count == '+' or count == '-':
return 0
if int(count)<-2147483648 :
return -2147483648
elif int(count)>2147483647:
return 2147483647
else:
return int(count)
提交结果 执行用时 内存消耗 语言
通过 32ms 12.9MB Python3

思路没什么好讲的,一堆ifelse显然易见


我的辣鸡代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class Solution:
def myAtoi(self, str: str) -> int:
str0 = str.strip()
if(str0==""):
return 0
list0 = ["0","1","2","3","4","5","6","7","8","9"]
index = -1
if(str0[0]=="-"):
str1 = str0[1:]
if(str1=="" or str1[0] not in list0):
return 0
for i in range(len(str1)):
if(str1[i] in list0):
continue
else:
index = i
break
if(index == -1):
index = len(str1)
if(int(str0[:index+1])<-2147483648):
return "-2147483648"
else:
return int(str0[:index+1])
elif(str0[0] in list0 or str0[0] == "+"):
if(str0[0]=="+"):
str0 = str0[1:]
if(str0 == "" or str0[0] not in list0):
return 0
for i in range(len(str0)):
if(str0[i] in list0):
continue
else:
index = i
break
if(index == -1):
index = len(str0)
if(int(str0[:index])>2147483647):
return "2147483647"
else:
return int(str0[:index])
else:
return 0
提交结果 执行用时 内存消耗 语言
通过 52 ms 13 MB Python3

代码和上面的第二个代码思路基本一样,但是多了几个冗余的if步骤,所以执行用时很慢

文章目录
  1. 1. LeetCode刷题笔记
    1. 1.1. 字符串转换整数
,