题目描述
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
输入描述:
输入一个字符串,包括数字字母符号,可以为空
输出描述:
如果是合法的数值表达则返回该数字,否则返回0
输入例子:
+2147483647
1a33
输出例子:
2147483647
0
python实现:
# -*- coding:utf-8 -*-
class Solution:
分析:# 考虑(1)符号位(2)符号位后没有数字了(3)前导0(4)溢出
MAXINT = 2**31-1
MININT = -2**31
def StrToInt2(self, s):
# write code here
#注意:此题目没考虑溢出,有溢出情况请参考:https://leetcode.com/submissions/detail/64704478/
s = s.strip()
n = len(s)
if n==0:
return 0#不合法
flag = True
#result = []
result = 0
for i in range(n):
if i==0 and (s[i]=="+" or s[i]=="-"):
if i==n-1:#+,-号后面没有数字了
return 0#不合法
else:
if s[i]=="-":
flag = False
continue
elif "0"<=s[i]<="9":
result = result*10+int(s[i])
else:
return 0#不合法
if flag:
return result
else:
return -result
# 考虑溢出的写法:大于32位有符号数的最大值时,则输出最大值
# 小于最小值时,输出最小值
def StrToInt(self, s):
MAXINT = pow(2, 31)-1
MININT = -MAXINT-1
s = s.strip()
n = len(s)
if n == 0:
return 0
flag = 1
if s[0] == "-":
flag = -1
s = s[1:]
elif s[0] == "+":
s = s[1:]
n = len(s)
validNums = []
for i in range(n):
if s[i].isdigit():
if not (s[i]=='0' and len(validNums)==0): # 去掉前导0
validNums.append(s[i])
else: # 非法字符
return 0
if len(validNums) == 0:
return 0
if flag == 1 and (len(validNums) > 10 or len(validNums)==10 and "".join(validNums)>str(MAXINT)):
return MAXINT
elif flag == -1 and (len(validNums) > 10 or len(validNums)==10 and "".join(validNums)>str(MININT)[1:]):
return MININT
else:
return int("".join(validNums))*flag