-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path8. String to Integer (atoi).go
144 lines (91 loc) · 3.5 KB
/
8. String to Integer (atoi).go
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
// Implement the myAtoi(string s) function, which converts a string to a 32-bit signed integer.
// The algorithm for myAtoi(string s) is as follows:
// Whitespace: Ignore any leading whitespace (" ").
// Signedness: Determine the sign by checking if the next character is '-' or '+', assuming positivity is neither present.
// Conversion: Read the integer by skipping leading zeros until a non-digit character is encountered or the end of the string is reached. If no digits were read, then the result is 0.
// Rounding: If the integer is out of the 32-bit signed integer range [-231, 231 - 1], then round the integer to remain in the range. Specifically, integers less than -231 should be rounded to -231, and integers greater than 231 - 1 should be rounded to 231 - 1.
// Return the integer as the final result.
// Example 1:
// Input: s = "42"
// Output: 42
// Explanation:
// The underlined characters are what is read in and the caret is the current reader position.
// Step 1: "42" (no characters read because there is no leading whitespace)
// ^
// Step 2: "42" (no characters read because there is neither a '-' nor '+')
// ^
// Step 3: "42" ("42" is read in)
// ^
// Example 2:
// Input: s = " -042"
// Output: -42
// Explanation:
// Step 1: " -042" (leading whitespace is read and ignored)
// ^
// Step 2: " -042" ('-' is read, so the result should be negative)
// ^
// Step 3: " -042" ("042" is read in, leading zeros ignored in the result)
// ^
// Example 3:
// Input: s = "1337c0d3"
// Output: 1337
// Explanation:
// Step 1: "1337c0d3" (no characters read because there is no leading whitespace)
// ^
// Step 2: "1337c0d3" (no characters read because there is neither a '-' nor '+')
// ^
// Step 3: "1337c0d3" ("1337" is read in; reading stops because the next character is a non-digit)
// ^
// Example 4:
// Input: s = "0-1"
// Output: 0
// Explanation:
// Step 1: "0-1" (no characters read because there is no leading whitespace)
// ^
// Step 2: "0-1" (no characters read because there is neither a '-' nor '+')
// ^
// Step 3: "0-1" ("0" is read in; reading stops because the next character is a non-digit)
// ^
// Example 5:
// Input: s = "words and 987"
// Output: 0
// Explanation:
// Reading stops at the first non-digit character 'w'.
// Constraints:
// 0 <= s.length <= 200
// s consists of English letters (lower-case and upper-case), digits (0-9), ' ', '+', '-', and '.'.
package main
import("fmt")
func strToInt(s string)int{
keyMapping:=map[rune]int{'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}
var res int;
neg:=false
firstCharFound:=false
for _,v:=range s{
if v=='-' && !firstCharFound {
neg=true;firstCharFound=true;continue
}else if v==' '{
if firstCharFound{break};
continue
}else if v=='+' && !firstCharFound{
firstCharFound=true
continue
}else if _,ok:=keyMapping[v];!ok{break}
if _,ok:=keyMapping[v];ok &&!firstCharFound{firstCharFound=true}
if firstCharFound{
if _,ok:=keyMapping[v];!ok{break}
res=(res*10)+keyMapping[v]
if res >= 2147483648 && !neg{
return 2147483647
}else if res >= 2147483648 && neg{
return -2147483648
}
}
}
if neg{res=-res} //changing to negetive value
return res
}
func main(){
inp:="-9223372036854775809"
fmt.Println(strToInt(inp))
}