题目描述:

方法一:正则

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

java版:

  1. package test;
  2.  
  3. import java.util.regex.Matcher;
  4. import java.util.regex.Pattern;
  5.  
  6. class Solution{
  7. public int myAtoi(String str) {
  8. str = str.trim();
  9. Pattern p = Pattern.compile("^[\\+\\-]?\\d+");
  10. Matcher m = p.matcher(str);
  11. int value = 0;
  12. if(m.find()) {
  13. try {
  14. value = Integer.parseInt(str.substring(m.start(), m.end()));
  15. } catch (NumberFormatException e) {
  16. value = str.charAt(0) == '-'? Integer.MIN_VALUE:Integer.MAX_VALUE;
  17. }
  18.  
  19. }
  20. return value;
  21. }
  22. }
  23. public class Test {
  24. public static void main(String[] args) {
  25. Solution s = new Solution();
  26. System.out.println(s.myAtoi(" -0456"));
  27. }
  28. }

方法二:

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

方法三:自动机

  1. INT_MAX = 2147483647
  2. INT_MIN = -2147483648
  3.  
  4. class Automaton:
  5. def __init__(self):
  6. self.state = 'start'
  7. self.sign = 1
  8. self.ans = 0
  9. self.table = {
  10. 'start':['start','signed','in_number','end'],
  11. 'signed': ['end', 'end', 'in_number', 'end'],
  12. 'in_number': ['end', 'end', 'in_number', 'end'],
  13. 'end': ['end', 'end', 'end', 'end'],
  14. }
  15.  
  16. def get_col(self,c):
  17. if c.isspace():
  18. return 0
  19. if c == '+' or c == '-':
  20. return 1
  21. if c.isdigit():
  22. return 2
  23. return 3
  24. def get(self,c):
  25. self.state = self.table[self.state][self.get_col(c)]
  26. if self.state == 'in_number':
  27. self.ans = self.ans*10 + int(c)
  28. self.ans = min(self.ans,INT_MAX) if self.sign == 1 else min(self.ans,-INT_MIN)
  29. elif self.state == 'signed':
  30. self.sign = 1 if c == '+' else -1
  31. class Solution:
  32. def myAtoi(self, str: str) -> int:
  33. automaton = Automaton()
  34. for c in str:
  35. automaton.get(c)
  36. return automaton.sign * automaton.a

java版

  1. class Solution {
  2.  
  3. class Automaton {
  4. final String START = "start";
  5. final String SIGNED = "signed";
  6. final String IN_NUM = "in_number";
  7. final String END = "end";
  8. String state = START;
  9. Map<String, String[]> map;
  10. public int sign = 1;
  11. public long ans = 0;
  12.  
  13. public Automaton() {
  14. map = new HashMap<>();
  15. map.put(START, new String[]{START, SIGNED, IN_NUM, END});
  16. map.put(SIGNED, new String[]{END, END, IN_NUM, END});
  17. map.put(IN_NUM, new String[]{END, END, IN_NUM, END});
  18. map.put(END, new String[]{END, END, END, END});
  19. }
  20.  
  21. public int get_col(char c) {
  22. if (c == ' ') return 0;
  23. if (c == '+' || c == '-') return 1;
  24. if (c >= '0' && c <= '9') return 2;
  25. return 3;
  26. }
  27.  
  28. public void get(char c) {
  29. state = map.get(state)[get_col(c)];
  30. if (state.equals(IN_NUM)) {
  31. ans = ans * 10 + c - '0';
  32. if (sign == 1) {
  33. ans = Math.min(ans, Integer.MAX_VALUE);
  34. } else {
  35. // -(long)Integer.MIN_VALUE,这个操作有点东西,不然越界
  36. ans = Math.min(ans, -(long)Integer.MIN_VALUE);
  37. }
  38. } else if (state.equals(SIGNED))
  39. sign = c == '+' ? 1 : -1;
  40. }
  41. }
  42.  
  43. public int myAtoi(String str) {
  44. Automaton automaton = new Automaton();
  45. char[] c = str.toCharArray();
  46. for (char ch : c) {
  47. automaton.get(ch);
  48. }
  49. return automaton.sign * ((int) automaton.ans);
  50. }
  51. }

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. JDK8新特性之函数式接口

    什么是函数式接口 先来看看传统的创建线程是怎么写的 Thread t1 = new Thread(new Runnable() { @Override public void run() { Syst ...

  2. MyEclipse中最常用的快捷键大全

    1. [ALT+/]    此快捷键为用户编辑的好帮手,能为用户提供内容的辅助,不要为记不全方法和属性名称犯愁,当记不全类.方法和属性的名字时,多体验一下[ALT+/]快捷键带来的好处吧. 2. [C ...

  3. selenium3与Python3实战 web自动化测试框架✍✍✍

    selenium3与Python3实战 web自动化测试框架  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课 ...

  4. .Net平台调用の参数对应

    具体对应参见官方<----点击此处 C#和C++的互操作性,同行的文章不错,点我跳转 //C++中的DLL函数原型为  //extern "C" __declspec(dll ...

  5. LVS DR模拟实验

    准备多台服务器,现以三台服务器为例第一台做调度器 192.168.200.111[root@localhost ~]# iptables -F[root@localhost ~]# setenforc ...

  6. 关于windows cmd的一些便捷应用

    在同事的指点下,我学会了一种非常方便的进入路径的方法 在windows文件夹中直接打开到要执行的文件的位置,然后在我的电脑那个路径当中输入cmd 之后,cmd的对话框会弹出来,并且显示在当前路径下,这 ...

  7. 将一个压缩文件分成多个压缩文件;RAR文件分卷

    有时候需要上传压缩文件,但是限制了单个文件的大小,那我们怎么才能将一个比较大的压缩文件分割成多个压缩文件,从而符合要求的进行文件的上传呢?这里小编告诉你一个技巧. 工具/原料 电脑 winrar(一般 ...

  8. python pathlib模块详解

    python pathlib模块详解    

  9. ajax-jq

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. 泛型(Generic)类的使用原因和使用方式

    我们每个苹果都套个盒子,给每本书都套个盒子,但是苹果盒子和书盒子是不同的, 这样下去如果有更多的东西需要套盒子,1000种产品有1000种相应的盒子,造成类型极度膨胀非常难以维护. class Pro ...