牛客网的题目描述不能看,看不懂,直接看LeetCode的吧。
根据上面的描述,我们大概有了几点思路:
- 开头空格要去掉
- 正负号要判断一下
- 第一个非空字符必须是数字/正负号
- 要限制数字大小
- 前面的判断完后,尾部还要进行判断,比如前面是数字,后面突然出现其他符号,后面的全部丢掉不看了。(剑指Offer直接return 0,但是LeetCode会让返回前面已有的数据)
所以我们写出了代码,不难。但要注意剑指Offer和LeetCode中的不同点在哪:
# -*- coding:utf-8 -*-
class Solution:
def StrToInt(self, s):
# write code here
i = 0
flag = 1 # 默认为正数1,负数为-1,最后可以直接和res相乘
res = 0 # 转换后的结果
INT_MAX = 2**31 # LeetCode和剑指Offer在这里也是不一样的
INT_MIN = -(2**31)-1
s = s.lstrip() # strip经常用,加个l,就是去掉左边的多余空格
if len(s) == 0:
return 0
if s[i] == '+':
i += 1
elif s[i] == '-':
flag = -1
i += 1
for item in s[i:]:
if '0' <= item <= '9':
res = res * 10 + (ord(item) - ord('0'))
# ord函数将字符变成十进制数,与'0'的十进制的差值即为这个数字本身
# 这里用哈希表或者列表的index来确定数字是多少也可以
else:
return 0 # LeetCode中换成break即可
res = flag*res
if INT_MIN <= res <= INT_MAX:
return res
elif res > INT_MAX:
return INT_MAX
else:
return INT_MIN