题意
给出一个字符串,trim 之后,按照 PHP 的方式将其转成 int。
题解
好吧……“按照 PHP 的方式”……
首先,可以以 +
或者 -
开头。其次,转换不下去的话就停止。
最后,把结果限定在 int 范围内。
第一次尝试
正则表达式大法好啊,写起来简单啊!
先做 trim,然后正则出来第一个结果,然后 int()
一下就好了。如果没有结果,pass。
这种做法呢,还有一个好处:如果说让你把串中所有的数字都转换出来,也是超级简单的:match
改为 findall
就好了。超级省心。
缺点么…… 时间,时间。
代码
class Solution(object):
def myAtoi(self, str):
"""
:type str: str
:rtype: int
"""
import re
INT_MAX = 2147483647
INT_MIN = -2147483648
ans = 0
match = re.match(r'(^[\-\+]?\d+)', str.strip())
if match:
ans = int(match.group(0))
ans = min(ans, INT_MAX)
ans = max(ans, INT_MIN)
return ans
运行结果
1047 / 1047 test cases passed.
Status: Accepted
Runtime: 159 msYour runtime beats 1.08% of pythonsubmissions.
OK 我不是最慢的~
第二次尝试
没啥技巧…… 最最传统的做法。
代码
class Solution(object):
def myAtoi(self, str):
"""
:type str: str
:rtype: int
"""
INT_MAX = 2147483647
INT_MIN = -2147483648
sym = 1
ans = 0
str = str.strip()
if len(str) == 0:
return 0
if str[0] in ['-', '+']:
if str[0] == '-':
sym = -1
elif str[0] == '+':
sym = 1
str = str[1:]
for x in str:
if '0' <= x <= '9':
ans = ans * 10 + int(x)
else:
break
ans *= sym
ans = min(ans, INT_MAX)
ans = max(ans, INT_MIN)
return ans
运行结果
1047 / 1047 test cases passed.
Status: Accepted
Runtime: 92 ms
其他想法
虽然传统办法比第一次正则表达式的办法快了不少,但是还是很慢啊。所以呢,可以用一个 ptr 记录当前最后位置,这样能少做一些乘法。
桩程序
if __name__ == '__main__':
cases = [
{'x': '123', 'ans': 123},
{'x': '+123', 'ans': 123},
{'x': '-123', 'ans': -123},
{'x': '-123 123', 'ans': -123},
{'x': '123', 'ans': 123},
{'x': 'aa123aa', 'ans': 0},
{'x': 'aa-123aa', 'ans': 0},
{'x': '2147463847', 'ans': 2147463847},
{'x': '2147483648', 'ans': 2147483647},
{'x': 'aa123bb-456', 'ans': 0},
]
for item in cases:
ans = (Solution()).myAtoi(str=item['x'])
print(str(ans == item['ans']) + "\t=>" + str(ans) + ":" + str(item['ans']))
发表回复