IT评测·应用市场-qidao123.com技术社区

标题: 力扣第八题——字符串转换整数 [打印本页]

作者: 曹旭辉    时间: 2024-7-17 15:08
标题: 力扣第八题——字符串转换整数
标题先容

   请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数。
  函数 myAtoi(string s) 的算法如下:
    返回整数作为最闭幕果。
  
  示例 1:
  输入:s = "42"
  输出:42
  表明:加粗的字符串为已经读入的字符,插入符号是当前读取的字符。
  1. 带下划线线的字符是所读的内容,插入符号是当前读入位置。
  2. 第 1 步:"42"(当前没有读入字符,因为没有前导空格)
  3.          ^
  4. 第 2 步:"42"(当前没有读入字符,因为这里不存在 '-' 或者 '+')
  5.          ^
  6. 第 3 步:"<u>42</u>"(读入 "42")
  7.            ^
复制代码
示例 2:
  输入:s = " -042"
  输出:-42
  表明:
  1. 第 1 步:"<u><strong>   </strong></u>-042"(读入前导空格,但忽视掉)
  2.             ^
  3. 第 2 步:"   <u>-</u>042"(读入 '-' 字符,所以结果应该是负数)
  4.              ^
  5. 第 3 步:"   <u>-042</u>"(读入 "042",在结果中忽略前导零)
  6.                ^
复制代码
示例 3:
  输入:s = "1337c0d3"
  输出:1337
  表明:
  1. 第 1 步:"1337c0d3"(当前没有读入字符,因为没有前导空格)
  2.          ^
  3. 第 2 步:"1337c0d3"(当前没有读入字符,因为这里不存在 '-' 或者 '+')
  4.          ^
  5. 第 3 步:"1337c0d3"(读入 "1337";由于下一个字符不是一个数字,所以读入停止)
  6.              ^
复制代码
示例 4:
  输入:s = "0-1"
  输出:0
  表明:
  1. 第 1 步:"0-1" (当前没有读入字符,因为没有前导空格)
  2.          ^
  3. 第 2 步:"0-1" (当前没有读入字符,因为这里不存在 '-' 或者 '+')
  4.          ^
  5. 第 3 步:"<u>0</u>-1" (读入 "0";由于下一个字符不是一个数字,所以读入停止)
  6.           ^
复制代码
示例 5:
  输入:s = "words and 987"
  输出:0
  表明:
  读取在第一个非数字字符“w”处停止。
  
  提示:
  
  完整代码

  1. class Solution {
  2.     public int myAtoi(String str) {
  3.         Automaton automaton = new Automaton();
  4.         int length = str.length();
  5.         for (int i = 0; i < length; ++i) {
  6.             automaton.get(str.charAt(i));
  7.         }
  8.         return (int) (automaton.sign * automaton.ans);
  9.     }
  10. }
  11. class Automaton {
  12.     public int sign = 1;
  13.     public long ans = 0;
  14.     private String state = "start";
  15.     private Map<String, String[]> table = new HashMap<String, String[]>() {{
  16.         put("start", new String[]{"start", "signed", "in_number", "end"});
  17.         put("signed", new String[]{"end", "end", "in_number", "end"});
  18.         put("in_number", new String[]{"end", "end", "in_number", "end"});
  19.         put("end", new String[]{"end", "end", "end", "end"});
  20.     }};
  21.     public void get(char c) {
  22.         state = table.get(state)[get_col(c)];
  23.         if ("in_number".equals(state)) {
  24.             ans = ans * 10 + c - '0';
  25.             ans = sign == 1 ? Math.min(ans, (long) Integer.MAX_VALUE) : Math.min(ans, -(long) Integer.MIN_VALUE);
  26.         } else if ("signed".equals(state)) {
  27.             sign = c == '+' ? 1 : -1;
  28.         }
  29.     }
  30.     private int get_col(char c) {
  31.         if (c == ' ') {
  32.             return 0;
  33.         }
  34.         if (c == '+' || c == '-') {
  35.             return 1;
  36.         }
  37.         if (Character.isDigit(c)) {
  38.             return 2;
  39.         }
  40.         return 3;
  41.     }
  42. }
复制代码
 思绪剖析

1. 类 Solution

方法 myAtoi


该方法首先创建一个 Automaton 对象,然后遍历字符串中的每个字符,调用 Automaton 对象的 get 方法举行处理。末了返回颠末处理的整数结果。
2. 类 Automaton

成员变量


方法 get


该方法首先根据当前状态和字符范例,从状态转移表中获取下一个状态。然后根据下一个状态实行相应的利用:

方法 get_col


该方法根据字符范例返回对应的列索引:

代码实行流程

知识点精炼



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4