Skip to content

Commit 55fa402

Browse files
committed
String to Integer (atoi)
1 parent 6d30076 commit 55fa402

File tree

2 files changed

+104
-0
lines changed

2 files changed

+104
-0
lines changed

Diff for: README.md

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
|1|[两数之和](https://leetcode-cn.com/problems/two-sum/)|[JavaScript](./algorithms/two-sum.js)|Easy|
66
|2|[两数相加](https://leetcode-cn.com/problems/add-two-numbers/)|[JavaScript](./algorithms/add-two-numbers.js)|Medium|
77
|7|[整数反转](https://leetcode-cn.com/problems/reverse-integer/)|[JavaScript](./algorithms/reverse-integer.js)|Medium|
8+
|8|[字符串转换整数 (atoi)](https://leetcode-cn.com/problems/string-to-integer-atoi/)|[JavaScript](./algorithms/string-to-integer-atoi.js)|Medium|
89
|9|[回文数](https://leetcode-cn.com/problems/palindrome-number/)|[JavaScript](./algorithms/palindrome-number.js)|Easy|
910
|14|[最长公共前缀](https://leetcode-cn.com/problems/longest-common-prefix/)|[JavaScript](./algorithms/longest-common-prefix.js)|Easy|
1011
|21|[合并两个有序链表](https://leetcode-cn.com/problems/merge-two-sorted-lists/)|[JavaScript](./algorithms/merge-two-sorted-lists.js)|Easy|

Diff for: algorithms/string-to-integer-atoi.js

+103
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
// 方法一:一般解法
2+
3+
/**
4+
* 字符串转换整数 (atoi)
5+
* @param {string} s
6+
* @return {number}
7+
*/
8+
var myAtoi = function (s) {
9+
let flag = 1; // 1:正数 1-:负数
10+
11+
s = s.trimStart();
12+
13+
if (s[0] === "-") {
14+
flag = -1;
15+
s = s.slice(1);
16+
} else if (s[0] === "+") {
17+
s = s.slice(1);
18+
}
19+
20+
let arr = [];
21+
let count = 0;
22+
23+
for (let i = 0; i < s.length; i++) {
24+
let curr = s[i];
25+
26+
if (+curr === +curr && count === i && curr !== " ") {
27+
arr.push(curr);
28+
count++;
29+
}
30+
}
31+
32+
let result = arr.length > 0 ? Number(arr.join("")) : 0;
33+
result *= flag;
34+
35+
const min = -Math.pow(2, 31);
36+
const max = Math.pow(2, 31) - 1;
37+
38+
if (result < min) {
39+
result = min;
40+
} else if (result > max) result = max;
41+
42+
return result;
43+
};
44+
45+
// 方法二:有限自动机 (DFA)
46+
47+
/**
48+
* 字符串转换整数 (atoi)
49+
* @param {string} s
50+
* @return {number}
51+
*/
52+
var myAtoi = function (s) {
53+
const am = automaton();
54+
55+
for (let i = 0; i < s.length; i++) {
56+
am.get(s[i]);
57+
}
58+
59+
return am.result()
60+
};
61+
62+
const MAX_NUMBER = Math.pow(2, 31) - 1;
63+
const MIN_NUMBER = -Math.pow(2, 31);
64+
65+
function automaton() {
66+
let sign = 1, ans = 0, state = "start";
67+
let table = {
68+
start: ["start", "signed", "in_number", "end"],
69+
signed: ["end", "end", "in_number", "end"],
70+
in_number: ["end", "end", "in_number", "end"],
71+
end: ["end", "end", "end", "end"],
72+
};
73+
74+
return {
75+
get(c) {
76+
state = table[state][this.getCol(c)];
77+
78+
if (state === "in_number") {
79+
ans = ans * 10 + Number(c);
80+
ans = sign === 1 ? Math.min(ans, MAX_NUMBER) : Math.min(ans, -MIN_NUMBER);
81+
} else if (state === "signed") {
82+
sign = c === "-" ? -1 : 1;
83+
}
84+
},
85+
86+
getCol(c) {
87+
if (c == " ") {
88+
return 0;
89+
}
90+
if (c == "+" || c == "-") {
91+
return 1;
92+
}
93+
if (/\d/.test(c)) {
94+
return 2;
95+
}
96+
return 3;
97+
},
98+
99+
result() {
100+
return sign * ans;
101+
},
102+
};
103+
}

0 commit comments

Comments
 (0)