leetcode 8.字符串转换整数
这题目,两种典型的思路,第一种,直接按照题目要求来做就好了。把前面的空格符跳过,处理±符号,然后将数字字符不断累加转换即可。
关键的一个点是如何判断溢出问题,用来记录答案的中间变量可以定义为long long变量(注意long和int都是四字节,usigned int也是不可取的,范围仍旧不满足要求。直接用longlong省时省力)
自己的实现代码如下
class Solution { public: int myAtoi(string str) { if(str.length()==0) return 0; int begin=0; while(str[begin]==' '&&begin<str.length()) begin++; if(begin==str.length())return 0; bool flag= false; if(str[begin]=='-'){ begin++; flag=true; } else if (str[begin]=='+'){ begin++; } else if (str[begin]>'9'||str[begin]<'0'){ return 0; } long long ans=0; while (str[begin]<='9'&&str[begin]>='0'&&begin<str.length()){ ans=ans*10+(str[begin]-'0'); if(!flag&&ans>=INT_MAX)return INT_MAX; else if(flag&&ans-1>=INT_MAX)return INT_MIN; begin++; } if (flag) return 0-ans; else return ans; } };
当然啦,如果学过正则表达式的人,应该都能想到用正则表达式直接把有效字符串提取出来,,,
但是我比较久没有用正则表达式(只在编译原理里面认真学过哈哈),确实一下想要上手有难度。
反正平常工作直接用轮子了,谁还去造。
正则表达式实现代码如下(python代码)。
class Solution:
def myAtoi(self, s: str) -> int:
return max(min(int(*re.findall('^[\+\-]?\d+', s.lstrip())), 2**31 - 1), -2**31)
- 使用正则表达式
^:匹配字符串开头,[\+\-]:代表一个+字符或-字符,?:前面一个字符可有可无,\d:一个数字,+:前面一个字符的一个或多个,\D:一个非数字字符 max(min(数字, 2**31 - 1), -2**31)用来防止结果越界

浙公网安备 33010602011771号