-
Notifications
You must be signed in to change notification settings - Fork 1
/
string-to-integer-atoi.js
75 lines (63 loc) · 1.64 KB
/
string-to-integer-atoi.js
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
69
70
71
72
73
74
75
//https://leetcode.com/problems/string-to-integer-atoi/
// Related Topics: Math, String
// Difficulty: Medium
/*
Initial thoughts:
Remove the first possible space character.
Handle a possible minus sign.
Handle each digit.
Check all the while that it doesn't goes outside of -2^31 or 2^31-1
Time complexity: O(n)
Space complexity: O(1)
*/
/**
* @param {string} str
* @return {number}
*/
const myAtoi = str => {
const MIN = 2 ** 31 * -1;
const MAX = MIN * -1 - 1;
let result = 0;
let isNegative = false;
let i = 0;
// move forward while white space
while (str.charCodeAt(i) === 32) i++;
// handle minus sign or plus sign
if (str.charCodeAt(i) === 45 || str.charCodeAt(i) === 43) {
if (str.charCodeAt(i) === 45) isNegative = true;
i++;
}
for (; i < str.length; i++) {
if (str.charCodeAt(i) < 48 || str.charCodeAt(i) > 57) {
if (isNegative) return result * -1;
else return result;
}
// handling the first digit
if (result === 0) result += str.charCodeAt(i) - 48;
else result = result * 10 + str.charCodeAt(i) - 48;
if (isNegative && result * -1 <= MIN) return MIN;
else if (!isNegative && result >= MAX) return MAX;
}
if (isNegative) return result * -1;
else return result;
};
/*
Using regular expression10
Time complexity: O(1)
Space complexity: O(1)
*/
/**
* @param {string} str
* @return {number}
*/
const myAtoi = str => {
str = str.trim();
const MIN = 2 ** 31 * -1;
const MAX = MIN * -1 - 1;
let result = /^([+-]{0,1})\d+/.exec(str);
if (!result) return 0;
result = parseInt(result[0]);
if (result > MAX) return MAX;
if (result < MIN) return MIN;
return result;
};