题目描述:

方法一:正则


import re
class Solution:
def myAtoi(self, str: str) -> int:
INT_MAX = 2149483647
INT_MIN = -2147483648
num = re.findall(r'^[\+\-]?\d+',str.lstrip())
return max(min(int(*num),INT_MAX),INT_MIN)

class Solution:
def myAtoi(self, str: str) -> int:
return max(min(int(*re.findall('^[\+\-]?\d+', str.lstrip())), 2**31 - 1), -2**31)

java版:

package test;

import java.util.regex.Matcher;
import java.util.regex.Pattern; class Solution{
public int myAtoi(String str) {
str = str.trim();
Pattern p = Pattern.compile("^[\\+\\-]?\\d+");
Matcher m = p.matcher(str);
int value = 0;
if(m.find()) {
try {
value = Integer.parseInt(str.substring(m.start(), m.end()));
} catch (NumberFormatException e) {
value = str.charAt(0) == '-'? Integer.MIN_VALUE:Integer.MAX_VALUE;
} }
return value;
}
}
public class Test {
public static void main(String[] args) {
Solution s = new Solution();
System.out.println(s.myAtoi(" -0456"));
}
}

方法二:

利用双指针加eval()函数
思路:
用left=0,right标记第一个数字和最后一个数字出现的位置
首先strip()去掉左右的空格
然后判断第一个字符是不是正负号,是的话left置为1
判断left后一个字符是否为数字,不是直接返回0
遍历不断更新right,找到第一个不是数字的字符后break
用res=str[left:right+1]提取纯数字字符串
需要注意的是,可能数字全为0.所以用lstrip()将左边的0清除
最后利用eval()函数将双引号去除,并判断是否需要填正负号
注意一些细节就ok了
下面代码都写有注释,用时28ms时间复杂度o(n)
class Solution:
def myAtoi(self, str: str) -> int:
str = str.strip()
if str == "":
return 0
left = 0
right = 0
maxi=2147483647
mini=-2147483648
if str[0]=="+" or str[0]=="-":
left = 1
if(left==1 and len(str)==1) or str[left]<"" or str[right]>"":
return 0
for i in range(left,len(str)):
if str[i]>='' and str[i]<='':
right = i
else:
break
res = str[left:right+1].lstrip("")
if len(res)==0:
return 0
else :
res=eval(res)
if left==1 and str[0]=='-':#判断正负
res=-res
if res>maxi:
return maxi
elif res<mini:
return mini
else :
return res

方法三:自动机

INT_MAX = 2147483647
INT_MIN = -2147483648 class Automaton:
def __init__(self):
self.state = 'start'
self.sign = 1
self.ans = 0
self.table = {
'start':['start','signed','in_number','end'],
'signed': ['end', 'end', 'in_number', 'end'],
'in_number': ['end', 'end', 'in_number', 'end'],
'end': ['end', 'end', 'end', 'end'],
} def get_col(self,c):
if c.isspace():
return 0
if c == '+' or c == '-':
return 1
if c.isdigit():
return 2
return 3
def get(self,c):
self.state = self.table[self.state][self.get_col(c)]
if self.state == 'in_number':
self.ans = self.ans*10 + int(c)
self.ans = min(self.ans,INT_MAX) if self.sign == 1 else min(self.ans,-INT_MIN)
elif self.state == 'signed':
self.sign = 1 if c == '+' else -1
class Solution:
def myAtoi(self, str: str) -> int:
automaton = Automaton()
for c in str:
automaton.get(c)
return automaton.sign * automaton.a

java版

class Solution {

    class Automaton {
final String START = "start";
final String SIGNED = "signed";
final String IN_NUM = "in_number";
final String END = "end";
String state = START;
Map<String, String[]> map;
public int sign = 1;
public long ans = 0; public Automaton() {
map = new HashMap<>();
map.put(START, new String[]{START, SIGNED, IN_NUM, END});
map.put(SIGNED, new String[]{END, END, IN_NUM, END});
map.put(IN_NUM, new String[]{END, END, IN_NUM, END});
map.put(END, new String[]{END, END, END, END});
} public int get_col(char c) {
if (c == ' ') return 0;
if (c == '+' || c == '-') return 1;
if (c >= '0' && c <= '9') return 2;
return 3;
} public void get(char c) {
state = map.get(state)[get_col(c)];
if (state.equals(IN_NUM)) {
ans = ans * 10 + c - '0';
if (sign == 1) {
ans = Math.min(ans, Integer.MAX_VALUE);
} else {
// -(long)Integer.MIN_VALUE,这个操作有点东西,不然越界
ans = Math.min(ans, -(long)Integer.MIN_VALUE);
}
} else if (state.equals(SIGNED))
sign = c == '+' ? 1 : -1;
}
} public int myAtoi(String str) {
Automaton automaton = new Automaton();
char[] c = str.toCharArray();
for (char ch : c) {
automaton.get(ch);
}
return automaton.sign * ((int) automaton.ans);
}
}

leetcode-8-字符串转换整数(atoi)的更多相关文章

  1. 前端与算法 leetcode 8. 字符串转换整数 (atoi)

    目录 # 前端与算法 leetcode 8. 字符串转换整数 (atoi) 题目描述 概要 提示 解析 解法一:正则 解法二:api 解法二:手搓一个api 算法 传入测试用例的运行结果 执行结果 G ...

  2. LeetCode 8. 字符串转换整数 (atoi)(String to Integer (atoi))

    8. 字符串转换整数 (atoi) 8. String to Integer (atoi) 题目描述 LeetCode LeetCode8. String to Integer (atoi)中等 Ja ...

  3. [LeetCode] 8. 字符串转换整数 (atoi)

    题目链接:https://leetcode-cn.com/problems/string-to-integer-atoi/ 题目描述: 请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先 ...

  4. 每日一题LeetCode 8. 字符串转换整数 (atoi)

    问题描述 请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当我们寻找到的第一个非空字符为正或者负号时,则将 ...

  5. LeetCode 8.字符串转换整数 (atoi)(Python3)

    题目: 请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当我们寻找到的第一个非空字符为正或者负号时,则将该 ...

  6. Java实现 LeetCode 8 字符串转换整数(atoi)

    8. 字符串转换整数 (atoi) 请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当我们寻找到的第一个非 ...

  7. LeetCode Golang 8. 字符串转换整数 (atoi)

    8. 字符串转换整数 (atoi) 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组 ...

  8. 字符串转换整数 (atoi) C++实现 java实现 leetcode系列(八)

    字符串转换整数 (atoi) java实现 C++实现 请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当 ...

  9. 17、字符串转换整数 (atoi)

    17.字符串转换整数 (atoi) 请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当我们寻找到的第一个非 ...

  10. 8. 字符串转换整数 (atoi)

    8. 字符串转换整数 (atoi) 方法一 import re import math class Solution(object): def myAtoi(self, str): "&qu ...

随机推荐

  1. [未解决]报错:DeprecationWarning: decodestring() is a deprecated alias since Python 3.1, use decodebytes()

    DeprecationWarning: decodestring() is a deprecated alias since Python 3.1, use decodebytes()

  2. C# String类常用操作

    1.string.Compare(s1,s2) 比较  按字母顺序后边的大于前边的 s1<s2 retrun -1 ;s1=s2 return 0; s1>s2 return1. Cons ...

  3. add a characteristic in enovia PLM

    Problem: add a new Char. name D_COI6 that the description is Injected coloration #7 (COI6) in the D_ ...

  4. 格式化抽象本地地址(实战linux socket编程)

    格式化抽象本地地址传统AF_UNIX套接口名字的麻烦之一就在于总是调用文件系统对象.这不是必须的,而且也不方便.如果原始的文件系统对象并没有删除,而在bind调用时使用相同的文件名,名字赋值就会失败. ...

  5. 一个简易h5涉及的ps技巧

    事实证明,很长时间不做,是会忘掉的呀,的呀,呀,啊~ 1.合并图层 CTRL+E合并多个图层 2.切片 3.导出 文件-------导出------存储为web所用格式-------->> ...

  6. Web响应的提高

    想象一下,如果用户在页面上触发一个点击事件,结果反应延迟比较明显,这将是一个令人沮丧的事情.而造成这个问题的原因就是响应延迟. 浏览器UI 线程 大家都知道浏览器的UI线程,大多数浏览器都是一个独立的 ...

  7. PHP获取远程客户端真实IP的办法!

    (1).REMOTE_ADDR:浏览当前页面的用户计算机的ip地址 (2).HTTP_X_FORWARDED_FOR: 浏览当前页面的用户计算机的网关 (3).HTTP_CLIENT_IP:客户端的i ...

  8. Linux(二)高级文本处理

    一.cut (cut 命令可以从一个文本文件或者文本流中提取文本列 ) 1.cut语法 cut -d '分隔字符' -f fields         用于有特定分隔字符 cut  -c 字符区间   ...

  9. delphi获得文件大小

    大概有这些方法可以获得文件大小 FileSizeByName(需要引用IdGlobal单元) GetFileSize FileSize(不能获得正在使用的文件大小) FileSeek TFileStr ...

  10. 将map转为Object,支持 Date/Boolean

    import lombok.extern.log4j.Log4j2; import java.lang.reflect.Field; import java.lang.reflect.Method; ...