想了想还是用leetcode吧,测试用例更加严谨一些,lintcode的题有些描述有问题,有些测试用例不够完善。
原题链接
题目:
将字符串转换为数字。
从第一个非空格的字符串开始处理到第一个非数字字符结束,如果str[0]是+/-,则将数字转换成对应的正负数;如果是数字,直接转换成对应正数;如果str[0]是非数字字符,直接返回0。
数字的大小范围为 [−2^31, 2^31 − 1],小于下界则返回下界值,大于上界返回上界值。
Input: "42"
Output: 42
Input: "4193 with words"
Output: 4193
Input: "-91283472332"
Output: -2147483648
这道题用python会简单不少,python自带大数处理功能,这就会使这道题简单不少。像这样:
>>> 2**34
17179869184
一个简单的思路是:
- 先去掉字符串最左边的空格
- 判断字符串的长度,如果长度为0,则直接返回0
- 判断str[0]是否为-/+,如果是-,最后的结果要乘-1;如果是+,最后的结果要乘1。字符串再从str[1]进行切片,并判断字符串长度。如果不是-/+,则不处理。
- 判断切片后的str[0]是否为数字,不是数字,直接return 0
- 循环读取字符串,同时将读取到的数字字符拼接成一个整数。碰到第一个非数字字符跳出循环。
- 对结果进行处理:判断大小和正负数处理。
代码:
class Solution:
def myAtoi(self, str: str) -> int:
str = str.lstrip()
INT_MAX = 2**31-1
INT_MIN = -2**31
temp = 1
ans = 0
if len(str)==0:
return 0
if str[0] == '-' or str[0] == '+':
if str[0]=='-':
temp = -1
else:
temp == 1
str = str[1:]
if len(str)==0:
return 0
elif str[0].isdigit() is False:
return 0
for i in str:
if i.isdigit() is True:
ans = ans * 10 + int(i)
else:
break
ans = ans*temp
if ans<INT_MIN:
return INT_MIN
elif ans>INT_MAX:
return INT_MAX
else:
return ans
待补充:可以考虑用java实现一下。