0%

leetcode 8 Solution

代码解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package com.demo.s8;

import java.util.HashMap;

/**
* 字符串转换整数 (atoi)
* 请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。
*
* 函数 myAtoi(string s) 的算法如下:
*
* 读入字符串并丢弃无用的前导空格
* 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
* 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
* 将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
* 如果整数数超过 32 位有符号整数范围 [−231,  231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
* 返回整数作为最终结果。
* 注意:
*
* 本题中的空白字符只包括空格字符 ' ' 。
* 除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。
*
*
* 来源:力扣(LeetCode)
* 链接:https://leetcode.cn/problems/string-to-integer-atoi
* 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
*/
public class Solution {
public int myAtoi(String s) {
// 自动机
HashMap<String, String[]> map = new HashMap();
map.put("start", new String[]{"start", "signed", "number", "end"});
map.put("signed", new String[]{"end", "end", "number", "end"});
map.put("number", new String[]{"end", "end", "number", "end"});
map.put("end", new String[]{"end", "end", "end", "end"});
//第一步开始
String step = "start";
long num = 0;
int sign = 1;
for(int i = 0;i < s.length() && !step.equals("end"); i++) {
char ch = s.charAt(i);
int n = getChar(ch);
//下一步,根据上一步和当前字符 匹配 自动机 得出
step = map.get(step)[n];
if("number".equals(step)) {
num = num * 10 + (ch - '0');
num = sign == 1 ? Math.min(num, (long)Integer.MAX_VALUE) : Math.min(num, -1 * (long)Integer.MIN_VALUE);
} else if("signed".equals(step)) {
sign = (ch == '+') ? 1 : -1;
} else if("signed".equals(step)) {
return 0;
}
}
return sign * (int)num;

}

private int getChar(char ch) {
if(' ' == ch) {
return 0;
} else if('+' == ch || '-' == ch) {
return 1;
} else if(0 <= ch-'0' && ch-'0' <= 9) {
return 2;
} else {
return 3;
}
}
}